C言語では、中括弧はスタックフレームとして機能しますか? 質問する

C言語では、中括弧はスタックフレームとして機能しますか? 質問する

新しい中括弧のセット内に変数を作成した場合、その変数は閉じ括弧でスタックからポップされるのでしょうか、それとも関数の最後まで保持されるのでしょうか? たとえば、次のようになります。

void foo() {
   int c[100];
   {
       int d[200];
   }
   //code that takes a while
   return;
}

dセクション中にメモリを消費しますかcode that takes a while?

ベストアンサー1

いいえ、中括弧はスタック フレームとして機能しません。C では、中括弧は命名スコープのみを示しますが、制御がスタックから渡されても何も破壊されず、スタックから何もポップされません。

コードを書いているプログラマーは、コードをスタック フレームのように考えることがよくあります。中括弧内で宣言された識別子は中括弧内でのみアクセス可能なので、プログラマーの観点からは、宣言されたときにスタックにプッシュされ、スコープの終了時にポップされるようなものです。ただし、コンパイラーは、エントリ/終了時に何かをプッシュ/ポップするコードを生成する必要はありません (通常は生成しません)。

また、ローカル変数はスタック領域をまったく使用しない場合があることにも注意してください。ローカル変数は、CPU レジスタまたはその他の補助ストレージの場所に保持されるか、完全に最適化される可能性があります。

したがって、d理論上は、配列は関数全体のメモリを消費する可能性があります。ただし、コンパイラはそれを最適化したり、使用期間が重複しない他のローカル変数とメモリを共有したりする可能性があります。

おすすめ記事