Что означает "размер кода" в MSIL
Когда вы видите строку в IL, например:
// Code size 25 (0x19)
что на самом деле означает nit? Речь идет об использовании памяти (байтов)? Все, что я смог собрать, было то, что это было больше, чем количество линий 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, он определяет размер кода как: Размер раздела кода (текста) или сумму всех разделов кода, если имеется несколько разделов. (Да?)
Ответы
Ответ 1
Не все коды операций IL имеют одинаковый размер, а кодировка аргументов для разных кодов операций также занимает различное пространство. "Размер кода" - это размер всех кодов операций плюс размеры их операндов.
Например, код операции nop
представляет собой один байт (как видно из OpCodes.Nop.Size
) и не принимает никакого операнда (как видно из OpCodes.Nop.OperandType
), поэтому для первой строки требуется один байт (который поэтому вторая строка помечена IL_0001
).
Аналогично, ldstr
также является одним байтом, но строковый аргумент представлен в IL смещением таблицы строк, который занимает 4 байта (что важно, содержимое строки не учитывает этот расчет), поэтому ваша вторая команда IL берет 5 байтов (и третья строка помечена IL_0006
).
И так далее.