Why does the C # compiler emit additional OpCodes in IL?

If I have a Multiply method that is 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 that don't make sense to me when I actually 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 same thing.

So the question is, why does the compiler emit extra OpCodes in IL?

I am using debug mode.

+6
source share
1 answer

Mainly to support debugging and stopping; See the answer here: Why are these nop instructions in my debug build?

+10
source

Source: https://habr.com/ru/post/898744/


All Articles