Почему компилятор C # генерирует дополнительные коды операций в IL? - PullRequest
6 голосов
/ 06 октября 2011

Если у меня есть метод Multiply, определенный как:

public static class Experiment
{
    public static int Multiply(int a, int b)
    {
        return a * b;
    }
}

Тогда почему компилятор испускает этот IL:

.method public hidebysig static int32 Multiply(int32 a, int32 b) cil managed
{
    .maxstack 2              //why is it not 16?
    .locals init (
        [0] int32 CS$1$0000) //what is this?
    L_0000: nop              //why this?
    L_0001: ldarg.0 
    L_0002: ldarg.1 
    L_0003: mul 
    L_0004: stloc.0          //why this?
    L_0005: br.s L_0007      //why this?
    L_0007: ldloc.0          //why this?
    L_0008: ret 
}

Как вы можете видеть, он также содержит некоторые дополнительные коды операций, которые не имеют смысла для меня, хотя на самом деле я ожидаю следующий IL:

.method public hidebysig static int32 MyMethod(int32 a, int32 b) cil managed
{
    .maxstack 16
    L_0000: ldarg.0 
    L_0001: ldarg.1 
    L_0002: mul 
    L_0003: ret 
}

, который делает то же самое.

Итак, вопрос в том, почему компилятор генерирует дополнительные коды операций в IL?

Я использую режим отладки.

1 Ответ

10 голосов
/ 06 октября 2011

В основном для отладки и поддержки точек останова; Смотрите ответ здесь: Почему эти инструкции nop в моей отладочной сборке?

...