当您在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/