MSIL中的"代码大小"是什么意思

Aru*_*run 10 .net cil

当你看到IL中的一行时:

// Code size       25 (0x19)
Run Code Online (Sandbox Code Playgroud)

尼特实际意味着什么?它是在谈论(字节)内存使用情况吗?我能够收集的只是它比IL线的数量多一个.以下是完整的IL.

.method private hidebysig static void  Execute(string y) cil managed
{
  // Code size       25 (0x19)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "string"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ldarg.0
  IL_000d:  callvirt   instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
  IL_0012:  call       void [mscorlib]System.Console::WriteLine(object)
  IL_0017:  nop
  IL_0018:  ret
} //
Run Code Online (Sandbox Code Playgroud)

当我查看ECMA_335文档时,它将代码大小定义为:代码(文本)部分的大小,或者如果有多个部分则所有代码部分的总和.(啊?)

kvb*_*kvb 9

并非所有IL操作码都具有相同的大小,并且对不同操作码的参数的编码也占用不同的空间量."代码大小"是所有操作码的大小加上其操作数的大小.

例如,nop操作码是单个字节(如图所示OpCodes.Nop.Size),并且不带任何操作数(如所见OpCodes.Nop.OperandType),因此第一行需要单个字节(这就是第二行标记的原因IL_0001).

同样,ldstr也是一个单字节,但字符串参数在IL中由字符串表偏移量表示,该字符串表偏移量占4个字节(重要的是,字符串的内容不会影响此计算),因此您的第二个IL指令需要5 个字节字节总数(第三行标有IL_0006).

等等.