为什么C#编译器在IL中发出额外的OpCode?

时间:2011-10-06 09:46:02

标签: c# cil il opcode

如果我将方法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中发出额外的OpCode?

我正在使用调试模式。

1 个答案:

答案 0 :(得分:10)

主要用于调试&断点支持;请在此处查看答案:Why are these nop instructions in my debug build?

相关问题