开发者

Why does C# compiler emit additional OpCodes in IL?

开发者 https://www.devze.com 2023-04-11 07:49 出处:网络
If I\'ve a method Multiply defined as: public static class Experiment { public static int Multiply(int a, int b)

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?

0

精彩评论

暂无评论...
验证码 换一张
取 消