私はILがどのように機能するかを調べるための簡単なプログラムを書きました:
void Main()
{
int a=5;
int b=6;
if (a<b) Console.Write("333");
Console.ReadLine();
}
IL:
IL_0000: ldc.i4.5
IL_0001: stloc.0
IL_0002: ldc.i4.6
IL_0003: stloc.1
IL_0004: ldloc.0
IL_0005: ldloc.1
IL_0006: bge.s IL_0012
IL_0008: ldstr "333"
IL_000D: call System.Console.Write
IL_0012: call System.Console.ReadLine
私は実装された効率を理解しようとしています:
1行目(ILコード)で、値5をスタックにプッシュします(int32である4バイト)
2行目(ILコード)で、スタックからローカル変数にPOPします。
次の2行も同じです。
次に、それらのローカル変数をスタックにロードしてから、評価しbge.s
ます。
質問1
なぜ彼はローカル変数をスタックにロードするのですか?値はすでにスタックにあります。しかし、彼はそれらをローカル変数に入れるためにそれらをポップしました。無駄じゃないですか?
つまり、コードが次のようなものになり得なかった理由:
IL_0000: ldc.i4.5
IL_0001: ldc.i4.6
IL_0002: bge.s IL_0004
IL_0003: ldstr "333"
IL_0004: call System.Console.Write
IL_0005: call System.Console.ReadLine
私のコードのサンプルはたった5行のコードです。50,000,000行のコードはどうですか?ILによって発行される余分なコードがたくさんあります
質問2
コードアドレスを見てください:
- IL_0009アドレスはどこにありますか?シーケンシャルになっているのではないですか?
+リリースモードで最適化フラグを使用したpsIm