3

Thinking in C++ (vol. 2) を読んでいます。

関数が呼び出されるたびに、その関数に関する情報がアクティベーション レコード インスタンス (ARI) (スタック フレームとも呼ばれる) のランタイム スタックにプッシュされます。典型的なスタック フレームには、(1) 呼び出し元の関数のアドレス (実行がそこに戻ることができるようにするため)、(2) 関数の静的な親の ARI へのポインター (呼び出された関数をレキシカルに含むスコープ、したがってグローバルな変数) が含まれます。関数にアクセスできます)、(3) それを呼び出した関数 (動的な親) へのポインター。動的な親リンクを繰り返したどることによって論理的に生成されるパスは、動的チェーン、または呼び出しチェーンです。

関数の静的および動的な親として作成者が何を意味するのか理解できません。また、項目 1、2、または 3 を区別することもできません。それらはすべて同じように見えます。誰か私にこの一節を説明してくれませんか?

4

2 に答える 2

2

これはすべて私には非常に奇妙に聞こえます。静的フレーム ポインターは通常、関数型言語などのレキシカル スコープを持つ言語や、ネストされた関数を持つパスカル ファミリで使用されます。グローバルはコンパイル時または実行時に一度バインドされ、フレーム ポインターは必要ありません。(1) は有効ですが、(2) C++ には存在しません。

(3) は、親フレーム ポインターを参照することを意図していたのではないかと思います。コール スタックは通常、リンクされたリストとしてセットアップされるため、デバッガーや関連ツールは、プログラムに関する深い知識がなくてもそれらを参照できます。

于 2010-03-26T12:41:22.010 に答える