2011-10-06 17 views
6

Si tengo un método Multiply definido como:¿Por qué el compilador de C# emite OpCodes adicionales en IL?

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

Entonces, ¿por qué el compilador emite esta 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 
} 

Como se puede ver, también contiene algunas OpCodes adicionales que no lo hacen tiene sentido para mí, cuando de hecho espero lo siguiente 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 
} 

que hace exactamente lo mismo.

Entonces, la pregunta es, ¿por qué el compilador emite OpCodes adicionales en IL?

Estoy usando el modo de depuración.

+1

¿Configuración de depuración o liberación? –

+0

@AlexFarber: Depurar. – Nawaz

+0

Al menos el 'NOP' solo está depurado y crea algún tipo de punto de secuencia sobre el cual el JITter no puede reordenar las instrucciones. Esto ayuda con la depuración. – CodesInChaos

Respuesta

Cuestiones relacionadas