2011-06-27 4 views
7

配列メンバを持つ構造体を持っていて、構造体のコンストラクタの配列のデフォルトのコンストラクタを明示的に呼び出すと、要素はデフォルトで構築されますか? (整数配列の場合は、ゼロ初期化を意味します)。デフォルトでは、整数配列を構築してゼロ初期化を行いますか?

struct S 
{ 
    S() : array() {} 

    int array[SIZE]; 
}; 

... 

S s; 
// is s.array zero-initialized? 

GCCとの簡単なテストは、これが事実であることを示唆しているが、私は、この動作に頼ることができることを確認したかったです。

(。私は明示的にデフォルト・構築していない場合は構造体のコンストラクタで配列を、配列要素がランダムな値を持っていることに気づいた)

+2

あなたは 'std :: vector'を使用していない特別な理由はありますか? – AJG85

+2

@ AJG85:はい。これらの構造の100000の配列を割り当てる場合、100000 * sizeof(int *)バイトとSIZEバイトの100000割り当ての1つの割り当てではなく、100000 * SIZEバイトの単一割り当てが行われるようにしたいと思います。 (一方で、 'boost :: array'(またはC++ 0xで' std :: array')を使うことで、もう少しC++ - yになります)。 – HighCommander4

+3

@High: 'std :: vector 'の精神モデルは完全に間違っています。フリーストアのオーバーヘッドに約12バイトの一定のオーバーヘッドを加えたオーバーヘッドがあります。 – fredoverflow

答えて

12

はい(ハイライトする鉱山):

(タイプTの値が初期化オブジェクトへのC++ 03 8.5)

手段:

  • Tがユーザ定義コンストラクタ(12.1)を持つクラス型(9節)である場合、Tのデフォルトコンストラクタが呼び出されます(Tにアクセス可能なデフォルトコンストラクタがない場合、初期化は不正です)。

  • Tはユーザ宣言コンストラクタことなく、非組合クラス型である場合、すべての非静的>データメンバとTの基底クラス成分である値に初期化

  • Tが配列型である場合各要素は値で初期化されます。

  • そうでない場合、オブジェクトは

...

その初期括弧の空集合である、すなわち、()、の値でなければならないオブジェクトをゼロに初期化され初期化されました。

+0

はい、そうです、Sはデフォルトで初期化されています。つまり、SがPODであり、配列のデフォルト初期化がゼロ初期化と同じではないため、内部の配列はあまりにもデフォルトで初期化されています。 –

+0

申し訳ありませんが、コンストラクタに気付かず、これがPOD 。申し訳ありませんが、あなたの答えは正しい –

+0

+1:すべての拠点をカバーする編集用。 – AJG85

関連する問題