1. ホーム
  2. c++

[解決済み】CやC++で静的変数はどこに格納されているのか?

2022-04-13 12:19:37

質問

静的変数は、実行ファイルのどのセグメント(.BSS、.DATA、その他)に格納され、名前の衝突がないようにするのですか? 例えば


foo.c:                         bar.c:
static int foo = 1;            static int foo = 10;
void fooTest() {               void barTest() {
  static int bar = 2;            static int bar = 20;
  foo++;                         foo++;
  bar++;                         bar++;
  printf("%d,%d", foo, bar);     printf("%d, %d", foo, bar);
}                              }

両方のファイルをコンパイルして、fooTest()とbarTestを繰り返し呼び出すmainにリンクすると、printf文が独立してインクリメントされます。 fooとbarの変数は翻訳ユニットに対してローカルなので、理にかなっています。

しかし、そのストレージはどこに割り当てられているのでしょうか?

はっきり言って、ELF形式のファイルを出力するようなツールチェインを持っていることが前提です。 したがって、私 信じる その があります。 は、実行ファイルにこれらの静的変数のためのスペースが確保されている必要があります。

議論のために、GCCツールチェインを使うと仮定しましょう。

どのように解決するのですか?

静止画の行き先は、静止画が次のようなものであるかどうかによります。 ゼロ初期化 . ゼロイニシャライズ 静的データは .BSS(ブロック・スタート・バイ・シンボル) , 非ゼロ初期化 のデータは .DATA