2011-10-06 66 views
6

如果我有一个方法Multiply定义为:为什么C#编译器在IL中发出额外的OpCode?

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中发出额外的OpCodes?

我正在使用调试模式。

+1

调试或发布配置? –

+0

@AlexFarber:调试。 – Nawaz

+0

至少'NOP'只是调试,并创建某种类型的序列点,JITter可能不会重新排序指令。这有助于调试。 – CodesInChaos

回答

相关问题