0

スタックとその仕組みを知っています。すべての関数がメモリ内に独自のスタックを割り当てていることも知っています。 しかし、私を混乱させることは、コンパイラがこれらの名前がこのスコープで宣言されていることがわかる方法です。指定された名前のエントリが存在する場合には、スタック全体をチェックしを繰り広げるん(それは排気らしい) このコードを考えてみます。コンパイラはどのようにスコープを解決しますか?

void func(int a) 
{ 
    cout<<a; 
    cout<<b; 
} 

ここでFUNCのスタックがのためのエントリが含まれているが、ときますコンパイラは名前bに出会うとスタックをチェックし、bのエントリがないことを知ります。今質問はそれがどのようにチェックされるのですか?スタック全体を展開しますか? とこの関数がbを含む別の関数の中で宣言されている場合、ほかのスタックもすべて展開する必要があります。

+0

この関数には独自のスタックが割り当てられていません。この関数は、プロセススタック上にスタックフレームを割り当てます。これはコンパイル時ではなく、実行時に発生します。以下の回答に記載されているように、コンパイラは、スコープの問題を解決するために、シンボルテーブルの階層(またはその論理的同等物)を使用します。 –

答えて

4

コンパイラはシンボルテーブルを通じて変数の範囲を解決します。各スコープには独自のシンボルテーブルがあり、これらのテーブルはプログラムの構造に基づいて階層的に構成されています。

コンパイラは、変数のスコープを解決したいときには、まず、現在のスコープのシンボルテーブルにその存在をチェックします。見つからなければ、親スコープのシンボルテーブルなどを試します。

各シンボルテーブルは比較的高速に検索する必要があります。

視覚的な例については、hereを参照してください。

関連する問題