Что означает "размер кода" в 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).

И так далее.