2016-12-27 4 views
4
.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  9 (0x9) 
    .maxstack 1 
    .locals init ([0] class ConstReadOnly.second p) 
    IL_0000: nop 
    IL_0001: ldc.i4.5 
    IL_0002: newobj  instance void ConstReadOnly.second::.ctor(int32) 
    IL_0007: stloc.0 
    IL_0008: ret 
} // end of method Program::Main 

IL_0002の後にIL_0007が続きます。
ここで実際に起こっていることはありますか?作成されたILコードには、いくつかの行がありません。ライン間でどのようなタスクが実行されますか?

+0

@Wiktor Zychlaしかし、私の質問は、これらの中間線のパフォーマンスとi have'ntが何か手掛かりを得ていることです。 –

答えて

2

ラベルのみです。その間にコードはありません。ラベルは、関数の先頭からのオフセットをバイト単位で表します。

offset_0: nop  //size 1 byte 
offset_1: ldc.i4.5 // size 1 byte 
offset_2: newobj instance void ConstReadOnly.second::.ctor(int32) // size 5 bytes 
offset_7: stloc.0 // size 1 byte 
offset_8: ret 

簡単に変更して再コンパイルできます。

+0

ありがとう@powel lukasik._can私は、メモリ割り当て範囲でビジュアルスタジオでコード行の実行を追跡する方法を教えてください。私たちはデバッグを行うことができますが、メモリ割り当てに関する情報は提供していません._ –

+0

@ murali.j元の質問とは少し関係がありません。私はあなたがそれをすることができるとは思わない。 R#に隠れた割り当てを示すプラグインがあります - https://github.com/controlflow/resharper-heapview –

+0

lukasikええ、それは無関係です。情報に感謝します。 –

0

/BYTESオプションを指定しながら、私はあなたのコードでildasmを実行すると、出力は次のとおりです。ここで

.method private hidebysig static void Main(string[] args) cil managed 
// SIG: 00 01 01 1D 0E 
{ 
    .entrypoint 
    // Method begins at RVA 0x2048 
    // Code size  9 (0x9) 
    .maxstack 1 
    .locals init (class ConstReadOnly.second V_0) 
    IL_0000: /* 00 |     */ nop 
    IL_0001: /* 1B |     */ ldc.i4.5 
    IL_0002: /* 73 | (06)000003  */ newobj  instance void ConstReadOnly.second::.ctor(int32) 
    IL_0007: /* 0A |     */ stloc.0 
    IL_0008: /* 2A |     */ ret 
} // end of method Program::Main 

あなたはコメントとしてディスク上にコードを表すために使用される実際のバイト数を見ることができます。 newobj命令(5バイト)を除いて、すべての命令は1バイトだけを使用していることに注意してください。これは、行ラベルで使用されている番号と正確に対応しています。

これらのラベルがあるので、どのジャンプ命令でもジャンプ先がわかります。彼らはあなたがC#で書いたコード行とは何の関係も持っていません。

関連する問題