如果我有一个Multiply方法定义为:
- public static class Experiment
- {
- public static int Multiply(int a,int b)
- {
- return a * b;
- }
- }
那么为什么编译器会发出这个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
- }
正如你所看到的,它还包含一些对我没有意义的额外操作码,实际上我期望以下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
- }
这是完全相同的事情.
所以问题是,为什么编译器会在IL中发出额外的OpCode?
我正在使用调试模式.
解决方法
主要用于调试和断点支持;在这里看到答案:
Why are these nop instructions in my debug build?