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.
¿Configuración de depuración o liberación? –
@AlexFarber: Depurar. – Nawaz
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