15

グローバル メモリは C++ で初期化されますか? もしそうなら、どのように?

(2番目) 明確化:

プログラムが起動するとき、プリミティブが初期化される前に、グローバル メモリになるメモリ空間には何がありますか? たとえば、ゼロになっているのか、ゴミなのかを理解しようとしています。

状況は次のとおりです:シングルトン参照を設定できますか-instance()初期化の前に呼び出しを介して:

MySingleton* MySingleton::_instance = NULL;

結果として2つのシングルトンインスタンスを取得しますか?

シングルトンの複数のインスタンスに関する私の C++ クイズを参照してください...

4

4 に答える 4

19

標準から:

静的ストレージ期間 (3.7.1) を持つオブジェクトは、他の初期化が行われる前にゼロで初期化されます (8.5)。ゼロ初期化と定数式による初期化をまとめて静的初期化と呼びます。他のすべての初期化は動的初期化です. 定数式 (5.19) で初期化された静的ストレージ期間を持つ POD [plain old data] 型 (3.9) のオブジェクトは、動的初期化が行われる前に初期化されるものとします。同じ翻訳単位の名前空間スコープで定義され、動的に初期化される静的保存期間を持つオブジェクトは、それらの定義が翻訳単位に現れる順序で初期化されます。[注:8.5.1 では、集合メンバーが初期化される順序について説明しています。ローカルの静的オブジェクトの初期化については、6.7 で説明されています。]

そうです、静的な保存期間を持つグローバルは初期化されます。たとえばヒープ上に割り当てられたグローバルは、もちろん自動的に初期化されません。

于 2008-09-13T17:20:43.197 に答える
9

はい、グローバル プリミティブは NULL に初期化されます。

例:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

ヒープ上のクラス、構造体、配列、メモリのブロックについて仮定することはできません...

常にすべてを初期化するのが最も安全です。

于 2008-09-13T16:15:28.360 に答える
7

組み込みの世界から来て...

コードは次の 3 つのタイプのメモリにコンパイルさ れ
ます

初期化されている場合、グローバルは .data に入ります。そうでない場合、それらは .bss に配置され、premain コードでゼロ化されます。

于 2008-09-13T16:28:05.663 に答える
0

静的/グローバル スコープで宣言された変数は、少なくとも VC++ では常に初期化されます。

状況によっては、実際には次の動作に違いがある場合があります。

int x = 0;

int main() { ... }

int x;

int main() { ... }

共有データ セグメントを使用している場合、VC++ は少なくとも明示的な初期化の存在を使用して#pragma data_seg、特定の変数をプロセスの共有データ セグメントまたはプライベート データ セグメントに入れるかどうかを決定します。

追加の楽しみとして、共有データ セグメントで宣言されたコンストラクター/デストラクターを持つ静的 C++ オブジェクトがあるとどうなるかを考えてみましょう。コンストラクター/デストラクタは、exe/dll がデータ セグメントにアタッチされるたびに呼び出されますが、これはほぼ確実に必要なものではありません。

詳細については、このKB 記事を参照してください

于 2008-09-13T16:34:42.293 に答える