2016-10-05 7 views
1

は、以下の例を見て:それは「」なしでは、変数をポップ変数の値を変更することができますどのようにC#の変更値スタック表現私はC#でのスタック上の変数について質問があり

static void Main(string[] args) 
{ 
    int a = 1; //this element goes to the stack as the first one 
    int b = 2; //second element in the stack 
    a = 4; 
    a++; 
} 

スタックからの "b"?

誰かが私にこのケースでどのように動作するか説明したら、感謝しますか?

+0

スタックはLIFOです。以前のエントリにアクセスするためにデータをポップアップする必要がありますが、何をしようとしているかを示すコードが表示され、要件に基づいて別のデータ構造を使用する可能性があります。 –

+0

テキストではなく画像として表示されます。 –

+0

答えがありがとうございますが、私の質問は異なります - スタックはあなたのように動作しますが、変数 "a"の値を変更するにはこの変数をポップアウトする必要がある場合、変数 "b"にアクセスすることは可能です。 – Hadrian

答えて

1

.NETが値の型を保持するために使用するメモリ構造は、実際には「スタック」と呼ばれますが、各変数は最後のものにしかアクセスできないLIFO構造に保持されているわけではありません。

あなたの質問に答えるには、変数aにアクセスする必要がある場合、CLRはこれを正確に実行します(つまり、直接アクセスします)。ここで何もポップする必要はありません。

詳しくは、http://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/などがあります。

0

ローカル変数は実際にはスタック上にありますが、コンパイラはスタックを隠します。基本的には、変数をスタックの先頭からの相対アドレスに変換します。あなたの例では、コンパイラはbがスタック上の最後のものであることを知っています。

関数が実行されると、1つのレジスタ(古典的な8086プロセッサのSP、おそらくESPなど)がスタックの先頭のアドレスを指します。関数の引数とローカル変数は、[SP + n]として扱われます。ここで、nはスタックの先頭からのバイト数です。

関連する問題