Why does C# compiler emit additional OpCodes in IL?
If I've a method Multiply
defined as:
public static class Experiment
{
public static int Multiply(int a, int b)
{
return a * b;
}
}
Then why does the compiler emit this 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
}
As you can see, it also contains some additional OpCodes which don't make sense to me, when in fact I expect the following 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
}
which does the very same thing.
So the question is, why does the compiler emit additio开发者_开发技巧nal OpCodes in IL?
I'm using Debug mode.
Mostly for debugging & breakpoint support; See an answer here: Why are these nop instructions in my debug build?
精彩评论