.net - MSIL中的 'code size'是什么意思

标签 .net cil

当您在IL中看到一条线时,例如:

// Code size       25 (0x19)

尼特实际上是什么意思?它在谈论内存使用(字节数)吗?我所能收集到的只是它比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
} //

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

最佳答案

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

例如,nop操作码是一个字节(如OpCodes.Nop.Size所示),并且不接受任何操作数(如OpCodes.Nop.OperandType所示),因此第一行需要一个字节(这就是为什么第二行标有IL_0001的原因) )。

同样,ldstr也是一个字节,但是字符串参数在IL中由字符串表偏移量表示,该偏移量占用4个字节(重要的是,字符串的内容未计入此计算),因此第二条IL指令将总共5个字节(第三行标有IL_0006)。

等等。

关于.net - MSIL中的 'code size'是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6529647/

相关文章:

c++ - 分析动态 pinvoke

c# - 将 SAFEARRAY 从 C# 传递到 COM

c# - 在持有该方法的对象的构造函数中调用实例方法是否是一种好习惯?

c# - 在 .NET 中我应该为 128 位数字使用什么类型?

c# - 如何使用 System.Linq.Expressions API 模拟 "typeof (T)"?

c# - C# JIT 优化器中可能存在错误?

c# - 在 .NET 4 下运行的 .NET 2 和 .NET 4 程序集之间有什么区别

.net 将数据推送到 SugarCRM 的问题

c# - .NET 2.0/C# 中泛型方法元数据的签名格式是什么?

c# - 在 CIL 中,为什么 BGE 等于 CLT.UN 后跟 BRFALSE?