Разве неявное приведение и явное приведение имеют одинаковую производительность? - PullRequest
0 голосов
/ 18 февраля 2020

Пример из w3school:

int myInt = 9;
double myDouble = myInt;       // Automatic casting: int to double

Console.WriteLine(myInt);      // Outputs 9
Console.WriteLine(myDouble);   // Outputs 9

и

double myDouble = 9.78;
int myInt = (int) myDouble;    // Manual casting: double to int

Console.WriteLine(myDouble);   // Outputs 9.78
Console.WriteLine(myInt);      // Outputs 9

добавляет ли явное приведение дополнительные издержки, особенно для большого числа / массива чисел? или это то же самое, что и неявное приведение?

Я должен был спросить об этом по академической причине c, а также хотел бы явным образом приводить мои объекты и интерфейсы везде, чтобы добавить ясности в кодовую базу.

Редактировать :

добавить пример животного:

IAnimal animal = (IAnimal) dog;
IAnimal animal = dog;

1 Ответ

1 голос
/ 18 февраля 2020

добавляет ли явное приведение дополнительные издержки, особенно для большого числа / массива чисел? или это то же самое, что и неявное приведение?

Вы можете обратиться к SharpLab , чтобы увидеть различия под капотом в IL. Как видите, логика c почти одинакова (за исключением типов, разумеется, потому что вы используете разные типы)

.method public hidebysig 
instance float64 AutoCast () cil managed 
{
    .maxstack 8

    IL_0000: ldc.i4.s 9
    IL_0002: conv.r8
    IL_0003: ret
} // end of method C::AutoCast

.method public hidebysig 
instance int32 ManualCast () cil managed 
{
    .maxstack 8

    IL_0000: ldc.r8 9.78
    IL_0009: conv.i4
    IL_000a: ret
} // end of method C::ManualCast

Или даже обратитесь к коду ASM

C.AutoCast()
    L0000: sub esp, 0x8
    L0003: vzeroupper
    L0006: vmovsd xmm0, qword [0x14540488]
    L000e: vmovsd [esp], xmm0
    L0013: fld qword [esp]
    L0016: add esp, 0x8
    L0019: ret

C.ManualCast()
    L0000: mov eax, 0x9
    L0005: ret

Как видите, приведение double к int просто перемещает значение и возвращает неотъемлемую часть, int к double более сложное. В результате вы можете увидеть различные результаты тестов.

enter image description here

Конечно, это зависит от используемой CLR и версии. NET (есть много улучшений. NET Core и некоторое оборудование также были добавлены встроенные функции). Я запустил его, используя. NET Core и CoreCLR, в. NET Framework вы увидите разные результаты.

Вы можете проверить точное поведение вашей среды с помощью своего кода (по крайней мере, потому что вы задали вопрос для Academi c reason)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...