Компилятор MS C # и неоптимизированный код
Примечание: я заметил некоторые ошибки в своем опубликованном примере - редактирование, чтобы исправить это
Официальный компилятор C # делает некоторые интересные вещи, если вы не включаете оптимизацию.
Например, простое утверждение if:
int x;
// ... //
if (x == 10)
// do something
становится что-то вроде следующего, если оптимизировано:
ldloc.0
ldc.i4.s 10
ceq
bne.un.s do_not_do_something
// do something
do_not_do_something:
но если мы отключим оптимизацию, она станет примерно такой:
ldloc.0
ldc.i4.s 10
ceq
ldc.i4.0
ceq
stloc.1
ldloc.1
brtrue.s do_not_do_something
// do something
do_not_do_something:
Я не могу разобраться с этим. Зачем весь этот дополнительный код, который, по-видимому, отсутствует в исходном коде? В C # это будет эквивалентно:
int x, y;
// ... //
y = x == 10;
if (y != 0)
// do something
Кто-нибудь знает, почему это происходит?