1. ホーム
  2. c

[解決済み] C言語では、中括弧はスタックフレームとして機能するのでしょうか?

2022-04-27 10:11:44

質問

新しい中括弧の中に変数を作成した場合、その変数は中括弧を閉じた時点でスタックからポップオフされるのでしょうか、それとも関数の終わりまで残っているのでしょうか?たとえば、以下のような場合です。

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

ウィル d の間、メモリを消費します。 code that takes a while セクションをご覧ください。

解決方法は?

いいえ、中括弧はスタックフレームとして機能しません。C言語では、中括弧は名前付けの範囲を示すだけで、制御が中括弧から外れたときに何も破壊されず、何もスタックからポップされません。

コードを書くプログラマーとしては、あたかもスタックフレームのように考えることが多いでしょう。 中括弧の中で宣言された識別子は、中括弧の中でしかアクセスできないので、プログラマーから見ると、宣言された時点でスタックに押し込まれ、スコープを抜けるときにポップされるようなものです。 しかし、コンパイラは、入力時/出力時に何かをプッシュ/ポップするコードを生成する必要はありません(一般に、そうすることはありません)。

また、ローカル変数はスタック領域を全く使用しないこともあります。CPUのレジスタや他の補助的な記憶場所に保持されたり、完全に最適化されたりしています。

そこで d 配列は、理論的には関数全体のメモリを消費することができます。 しかし、コンパイラはこの配列を最適化したり、使用期間が重ならない他のローカル変数とメモリを共有したりすることができます。