2011-06-30 9 views
10

を何を意味するのでしょうか?メモリ使用量(バイト)について話していますか?私が集めることができたのは、IL線の数よりも1つ多いということでした。以下は完全なILです。は、MSILの「コード・サイズは」

.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のドキュメントを見てみると、それはのようにコードサイズを定義します。複数のセクションがある場合、コード(テキスト)セクション、またはすべてのコードセクションの合計サイズ。

答えて

9

すべてのILオペコードが同じサイズではなく、異なるオペコードへの引数のエンコーディングも異なる量のスペースを占めます。 「コードサイズ」は、すべてのオペコードのサイズにオペランドのサイズを加えたものです。例えば

nopオペコードが、単一のバイト(OpCodes.Nop.Sizeによって見られるように)であり、そして(OpCodes.Nop.OperandTypeによって見られるように)任意のオペランドを取らないので、最初の行は、なぜ第二線である1バイトを(必要IL_0001と表示されている)。

は同様に、ldstrも単一バイトであるが、文字列引数は、4つのバイトをとるオフセット文字列テーブル、(重要なのは、文字列の内容はこの計算に考慮していない)によってILで表され、そのため、2番目のIL命令は合計5バイト必要です(3行目はIL_0006というラベルが付けられています)。

など。

関連する問題