2009-04-09 4 views
3

私はもともと、このようないくつかのコードを書いた:私はm_buffer()初期化子を有するメモリをゼロにすると述べたよりも賢いですC++ empty-parenメンバの初期化 - メモリをゼロにしますか?

class Foo 
{ 
public: 
    Foo() : m_buffer() 
    {} 

private: 
    char m_buffer[1024]; 
}; 

誰かを。私の意図は、メモリを初期化しないままにすることでした。私はそれについてさらに議論する時間がなかったが、それは私の好奇心を刺激した。

以前は、各メンバーをイニシャライザーリストに常にリストすることが賢明だと思っていました。

誰かがこの動作をさらに記述できますか?

1)空白の初期化子がメモリを埋めるのはなぜですか?

2)PODデータ型のみを保持しますか?それはそうだと聞きましたが、標準を手に入れませんでした。

おかげ

+0

「このように行動する」。どちら?どうか明らかにしてください。 –

+0

done - 私はメモリの埋め込みについて言及していた –

答えて

11

メンバーを初期化した場合は、value-initializedとなります。これはPODにも当てはまります。構造体の場合、すべてのメンバーがそのように値で初期化され、配列の場合、すべてのメンバーが値で初期化されます。

ポインタまたは整数のようなスカラー型の値の初期化では、正しい型に変換された0に初期化されます。だから、あなたはnullポインタかfalseか、あなたが具体的に持っているタイプを取得します。

ルールがC++ 98からC++ 03に微妙に変更されていることに注意してください。これは驚くべき効果があります。 C++ 98には、value-initializationがありませんでした。それは、デフォルトの初期化が行われたことを示します。これは、非PODタイプの場合、常にデフォルトのコンストラクタが呼び出されることを意味します。しかし、C++ 03のvalue-initializationは、ユーザーが宣言したコンストラクタがないと特別な意味を持ちます。すべての要素は値で初期化されます。ここで

が違いです:

struct A { int c; ~A() { } }; // non-POD, but no user declared ctor 
struct B { A a; B():a(){ } } b; 

さて、C++ 03で、あなたはb.a.cがゼロであることを保証されます。 C++ 98では、b.a.cには未確定の値があります。

+2

値の初期化は私をこのブーストサイトに導いた:http://www.boost.org/doc/libs/1_38_0/libs/1/38_0/libs/utility/value_init.htm#valueinit どうやら、一部のコンパイラで値の初期化が間違っているため、初期化されていないものが残っています。標準が何であるかはまだ分かります。 –

+0

あなたはあなたの89と98が混在していると思いますか? –

+0

ああありがとう。私は –

1

は以前、私はそれが常に 初期化子リスト内の各メンバーをリストする 賢明だと思ったいました。

これは、すべてのメンバーが初期化されていることを確認するためです。

タスクを解決するには、単純に初期化リストからm_bufferを削除します。

template <typename T> 
struct C 
{ 
    C(): 
     buff(), 
     var(), 
     object() 
    { 
    } 
    T buff[128]; 
    T var; 
    std::string object; 
}; 

どのTタイプを使用していても、T()はデフォルトのコンストラクタになります。 int、charsなどの場合、配列は{T()}です。そしてクラスのために、それは単にそれらのデフォルトのコンストラクタです。

関連する問題