2011-06-30 37 views
10

Kiedy widzisz linię w IL takiego:co robi „rozmiar kod” w MSIL oznaczać

// Code size  25 (0x19) 

co to nit właściwie znaczy? Czy chodzi o użycie pamięci (bajtów) pamięci? Wszystko co mogłem zebrać, to to, że jest to więcej niż liczba linii IL. Poniżej znajduje się pełna 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 
} // 

Kiedy patrzę na ECMA_335 dokumentacji określa rozmiar kodu jak: wielkość sekcji kodu (tekst), czy suma wszystkich sekcji kodu, jeśli istnieje wiele odcinków. (huh?)

Odpowiedz

9

Nie wszystkie kody opcyjne IL mają ten sam rozmiar, a kodowanie argumentów do różnych kodów operacyjnych również zajmuje różne ilości miejsca. "Rozmiar kodu" jest wielkością wszystkich kodów operacji plus rozmiarami ich operandów.

Na przykład nop opcode jest pojedynczy bajt (jak widać przez OpCodes.Nop.Size), i nie podejmować żadnych argument (jak widać przez OpCodes.Nop.OperandType), więc pierwsza linia wymaga jednego bajta (dlatego druga linia jest oznaczone jako IL_0001).

Podobnie ldstr również jeden bajt, ale argument ciąg jest reprezentowany przez IL ciąg tabeli offsetu, która trwa od 4 bajty (ważniejsze, zawartość łańcucha nie uwzględniają w tym obliczeniu) więc twoja druga instrukcja IL zajmuje 5 bajtów łącznie (a trzecia linia zostaje oznaczona jako IL_0006).

I tak dalej.