[解決済み] 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
配列は、理論的には関数全体のメモリを消費することができます。 しかし、コンパイラはこの配列を最適化したり、使用期間が重ならない他のローカル変数とメモリを共有したりすることができます。
関連
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] JavaScriptでStackとQueueを実装するには?
-
[解決済み] なぜJavaのVector(およびStack)クラスは時代遅れ、または非推奨とされているのですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] どちらが速いですか?スタックアロケーションとヒープアロケーション
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
C++の配列コピー
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] ⑭と⑯は何のためにあるのですか?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] なぜ16進数には0xがつくのですか?