スタック上の変数はどのようにアクセスされるのでしょうか?
-
22-08-2019 - |
質問
次のローカル変数があるとします。
int a = 0;
int b = 1;
int c = 2;
int d = 3;
私の知る限り、これらは次のようにシステム スタックに割り当てられます。
| |
| 3 | d
| 2 | c
| 1 | b
|_0_| a
これは、a の値を取得するには、まず d、c、b の値をスタックから取り出す必要があるという意味ですか?もしそうなら、これらの値はどこに行くのでしょうか?これは、最近宣言された変数へのアクセスが高速になることを意味しますか?それとも、私が何かを見逃していて(おそらくそうなっていると思います)、全体が別の方法で機能しているのでしょうか?
編集: みんなありがとう!
解決
スタック上のローカル変数は通常、いわゆる フレームポインタ, 、スタック フレームの先頭を指します。スタック ポインタを基準にしてこれを行うことも可能ですが、これは式の評価中に移動するため、追跡するのがより困難になります。
実際には、そのような変数はプロセッサ レジスタに保持されることもあります。
他のヒント
それとも何かが足りないのでしょうか
スタックが通常のメモリに常駐しているため、ランダム アクセスが可能です。フレーム ポインタ (「ローカル」スタックの一番下) に適切なオフセットを追加するだけで、値を保持するメモリ セルへのポインタが得られます。
これは、aの値を取得するために、d、c、bの値を最初にスタックからポップアウトする必要があることを意味しますか?
発行されたコードは単に スタックポインタ 関数を入力するときに正しいバイト数を指定してください。関数を終了するときに同じ距離だけ戻ります。したがって、変数を個別にポップオフすることはありません。int が 4 バイトであると仮定すると、指定した例ではスタック ポインタが 16 バイト移動します。戻りアドレスなどのスタック フレーム内の他の情報により、実際にはこれよりもさらに遠くに移動します。