これは非常に単純な質問かもしれませんが、ここで答えを見つけることができず、答えを尋ねた人も知りませんでした:
次のような簡単な C# メソッドを記述できます。
private void foo()
{
int a = 1;
int b = 5;
}
(コンパイラによって作成された) CIL コードが共通言語ランタイムによって実行されると、実行中のコントロールがメソッド内にある間に、スタックの一番上に次のフィールドが作成されます。
b = 5
a = 1
しかし今、「a」というフィールドにアクセスするメソッドを次のように拡張します。
private void foo()
{
int a = 1;
int b = 5;
Console.WriteLine(a);
}
現在、CLR はスタックの最上位にないフィールドにアクセスする必要がありますが、FILO (先入れ後出し) の原則に従って、アクセスする前に、要求されたフィールドより上のすべてのフィールドを処理する必要があります。
要求されたフィールド「a」の上のスタックにある「b」というフィールドはどうなりますか?
後で実行中のメソッドによって使用される可能性があるため、CLR はそれを削除できません。
私の知る限り、フィールド、スタック、またはヒープを格納する方法は2つしかありません。これをヒープに移動しても、CLR からのスタックからすべての利点が得られるため、あまり意味がありません。CLR は 2 番目のスタックのようなものを作成しますか?
それはどのように正確に機能しますか?
-編集-
たぶん、私は自分の意図を十分に明確に説明していませんでした。
このようなメソッドを書くと:
private void foo()
{
int a = 1;
int b = 5;
Console.WriteLine(a);
Console.WriteLine(b);
}
CLR は最初にスタックに 2 つのフィールドを書き込み、その後それらにアクセスしますが、順序が逆になります。
まず、フィールド "a" にアクセスする必要がありますが、そこに到達するために、CLR はスタック上のフィールド "a" の上にあるフィールド "b" を処理する必要があります。後でアクセスする必要があるため、スタックからフィールド「b」を削除することはできません。
それはどのように機能しますか?