7

昨日、インタビュアーが変数が格納されているストレージクラスについて質問したインタビューがありました。

私の答えの戦争:

Local Variables are stored in Stack.       
Register variables are stored in Register
Global & static variables are stored in data segment.  
The memory created dynamically are stored in Heap.

彼が私に尋ねた次の質問は、なぜそれらがそれらの特定のメモリ領域に保存されるのかということでした。に格納されLocal variable ないのはなぜですか(プログラムで頻繁に使用される変数がregister必要ですが)?autoまたは、なぜグローバル変数または静的変数がnotに格納されるのstackですか?

それから私は無知でした。私を助けてください。

4

5 に答える 5

16

ストレージ領域が変数 のスコープ存続期間を決定するためです。

要件に応じてストレージ仕様を選択します。つまり、存続期間
:特定の変数が有効で有効である必要があると予想される期間。
スコープ:変数にアクセスできると予想されるスコープ(領域)。

つまり、各ストレージ領域は異なる機能を提供し、さまざまな機能が必要になるため、異なるストレージ領域が必要になります。

于 2012-05-25T06:13:16.763 に答える
14

C言語では、実際には変数が格納される場所は定義されていません。ただし、静的、自動、動的の3つのストレージクラスを定義します。

静的変数は、プログラムの初期化(の前main())中に作成され、プログラムが終了するまで存在し続けます。ファイルスコープ(「グローバル」)および静的変数は、このカテゴリに分類されます。これらは通常、データセグメントに格納されますが、C標準ではこれが当てはまる必要はなく、場合によっては(Cインタープリターなど)、ヒープなどの他の場所に格納されることもあります。

自動変数は、関数本体で宣言されたローカル変数です。これらは、プログラムフローが宣言に達するときまたはその前に作成され、スコープ外になると破棄されます。これらの変数の新しいインスタンスは、再帰関数呼び出し用に作成されます。スタックはこれらの変数を実装するための便利な方法ですが、繰り返しになりますが、必須ではありません。必要に応じて、ヒープに自動を実装することもできます。自動は通常、レジスタにも配置されます。多くの場合、自動変数はその存続期間中にスタックとヒープの間を移動します。

register自動変数の注釈はヒントであることに注意してください。コンパイラーはそれを使って何もする義務はなく、実際、多くの最新のコンパイラーはそれを完全に無視します。

最後に、動的オブジェクト(Cには動的変数などはありません)はmalloccallocまたは他の同様の割り当て関数を使用して明示的に作成された値を参照します。それらは明示的に作成されたときに存在し、明示的に解放されたときに破棄されます。ヒープは、これらを配置するのに便利な場所です。つまり、このスタイルの割り当てを実行する機能に基づいてヒープを定義します。しかし、繰り返しになりますが、コンパイラの実装は自由にやりたいことができます。コンパイラーが静的分析を実行して動的オブジェクトの存続期間を判別できる場合、それをデータ・セグメントまたはスタックに移動できる可能性があります(ただし、この種の「エスケープ分析」を実行するCコンパイラーはほとんどありません)。

ここで重要なポイントは、C言語標準では、特定の値が存在する期間のみが定義されていることです。そして、その時点でのこのライフタイムの最小範囲-必要以上に長く残る可能性があります。これをメモリに正確に配置する方法は、言語とライブラリの実装に大きな自由が与えられる主題です。

于 2012-05-25T06:18:32.347 に答える
1

実際には、便利なのは実装の詳細にすぎません。

コンパイラーは、必要に応じて、ヒープ上にローカル変数を生成できます。

関数を離れるときに、スタックの成長方向に応じて単純な加算/減算でフレームポインターを調整できるため、スタック上にそれらを作成する方が簡単です。したがって、次の関数のために使用済みスペースを自動的に解放します。ただし、ヒープ上にローカルを作成すると、ハウスキーピング作業が増えることになります。

もう1つのポイントは、ローカル変数をスタック上に作成してはならないことです。コンパイラーがそれがより適切であり、そうするのに十分なレジスターがあると判断した場合、ローカル変数はレジスターにのみ格納して使用できます。

于 2012-05-25T06:19:43.660 に答える
0

ローカル変数はほとんどの場合レジスタに格納されます。これは、関数呼び出しを行うときにレジスタがスタックからプッシュおよびポップされるためです。これらはスタック上にあるように見えます。

これは、コンパイラにレジスタに入れようとするように指示するCでめったに使用されないキーワードであるため、実際にはレジスタ変数のようなものはありません。ほとんどのコンパイラはこのキーワードを無視していると思います。

それで、あなたがトピックを深く理解しているかどうか彼は確信が持てなかったので、あなたにもっと尋ねました。事実、レジスタ変数は事実上スタック上にあります。

于 2012-05-25T06:20:52.187 に答える
0

組み込みシステムでは、使用するメモリの種類(読み取り専用不揮発性(ROM)、読み取り/書き込み不揮発性(EEPROM、PROM、SRAM、NVRAM、フラッシュ)、揮発性(RAM))があり、要件も異なります(変更できません)また、電源を入れ直した後も持続し、変化する可能性があり、電源を入れ直した後も持続する可能性があり、いつでも変化する可能性があります)。データの要件をさまざまなタイプの使用可能なメモリに楽観的にマッピングする必要があるため、さまざまなセクションがあります。

于 2013-06-19T07:34:54.393 に答える