2011-06-30 14 views
10

Cuando vea una línea en la IL como:lo que significa 'el tamaño del código' en MSIL significa

// Code size  25 (0x19) 

lo que no nit significa realmente? ¿Está hablando del uso de (bytes de) memoria? Todo lo que pude reunir fue que es una más que la cantidad de líneas IL. A continuación está el IL completo.

.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 
} // 

Cuando miro ECMA_335 documentación, se define como el tamaño de código: El tamaño de la sección de código (texto), o la suma de todas las secciones de código si hay varias secciones. (¿eh?)

Respuesta

9

No todos los códigos de operación IL son del mismo tamaño, y la codificación de los argumentos para diferentes códigos de operación también ocupa diferentes cantidades de espacio. El "tamaño de código" es el tamaño de todos los códigos de operación más los tamaños de sus operandos.

Por ejemplo, el código de operación nop es un solo byte (como se ve por OpCodes.Nop.Size), y no toma ningún operando (como se ve por OpCodes.Nop.OperandType), por lo que la primera línea requiere un único byte (que es la razón por la segunda línea está etiquetado con IL_0001).

Asimismo, ldstr es también un solo byte, pero el argumento de cadena se representa en IL por una tabla de desplazamiento de cadena, que tiene 4 bytes (importante, los contenido de la cadena no factor en este cálculo), por lo que su segunda instrucción IL toma 5 bytes en total (y la tercera línea se etiqueta con IL_0006).

Y así sucesivamente.

Cuestiones relacionadas