Как это сделать does.NET JIT определить, как добавлять числа


CIL имеет один опкод для добавления чисел без проверки переполнения - add.

Этот код C#:

int a = 10;
int b = 20;
int c = a + b;

Выдает следующий код IL:

IL_0000:  ldc.i4.s   10
IL_0002:  stloc.0
IL_0003:  ldc.i4.s   20
IL_0005:  stloc.1
IL_0006:  ldloc.0
IL_0007:  ldloc.1
IL_0008:  add
IL_0009:  stloc.2

Как JIT во время выполнения определяет, какой тип x86-сложения он должен использовать (FPU opcode faddp для поплавков или add для целых чисел)?

1 2

1 ответ:

Среда CLR отслеживает типы значений в стеке вычислений, поэтому она знает, что непосредственно перед инструкцией add типы двух самых верхних значений в стеке находятся в коде int32. Это означает, что он знает, что должен выдать инструкцию для сложения 32-разрядных целых чисел.

Если вы пишете код, в котором среда CLR не сможет определить типы операндов add, ваш код будет непроверяемым и, вероятно, приведет к мусорному машинному коду.