C ++ 11で、すでにゼロT *array = new T[n];
に設定されている動的配列を割り当てると(gcc 4.7.2、Ubuntu 12.10 64ビットを使用)。
- これはC++11仕様によって強制されていますか?
- アイテムをゼロにすることなく配列を割り当てるにはどうすればよいですか?これはおそらく少し速いはずです。
編集:私はそれをチェックしましたT = int
。
gcc cxx-フラグ:-std=gnu++11 -O3 -ffast-math -fno-rtti
C ++ 11で、すでにゼロT *array = new T[n];
に設定されている動的配列を割り当てると(gcc 4.7.2、Ubuntu 12.10 64ビットを使用)。
編集:私はそれをチェックしましたT = int
。
gcc cxx-フラグ:-std=gnu++11 -O3 -ffast-math -fno-rtti
§5.3.4
new-initializerを省略すると、オブジェクトはデフォルトで初期化されます(8.5)。初期化が実行されない場合、オブジェクトの値は不確定です。
new-initializerは、省略した()
inです。new T[] ()
§8.5/6
T型のオブジェクトをデフォルトで初期化するということは、次のことを意味します。
— Tが(おそらくcv修飾された)クラスタイプの場合(第9節)、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります)。
— Tが配列型の場合、各要素はデフォルトで初期化されます。
—それ以外の場合、初期化は実行されません。
int[]はデフォルトで初期化されます->各要素はデフォルトで初期化されます。
「これはC++11仕様によって強制されますか?」:「初期化は実行されません」。したがって、Tにゼロ化コンストラクターがない場合(つまり、TがPODである場合)、ゼロ化は強制されません。T = intの場合、ゼロ化を実行する必要はありません。
とにかくゼロなのはなぜですか?プログラムがオペレーティングシステムから新しいメモリを割り当てる場合、OSは新しいメモリをゼロにします。賢明なデータを保存している可能性のある別のプログラムのメモリを読み取ることができれば、非常に危険です。ただし、そのメモリに書き込み、解放して、その一部を再度割り当てる場合は、ゼロにしないでください。
初期化されません(もちろん、Tがクラスの場合はコンストラクターを呼び出します)。値の初期化を強制するには(これは初心者には誤解を招く可能性がある名前です。これをゼロ初期化と呼びましょう。これは、のようなプリミティブ型の場合ですint
)。
new T[N]()
つまり、かっこを1つ入れてください。
実際のタイプによって異なりますT
。特定の条件下では、ゼロで初期化される場合があります。ここを参照してください:C++でのデフォルトの初期化
std::get_temporary_buffer
C ++機能を使用して初期化されていないメモリ( ?)を動的に割り当てることができる場合でも、OSのlibcの基本的な実装はmalloc()
、大きな割り当てブロック(大きい場合は調整可能)に::new
匿名を使用することmmap()
です。そしてanonymousは常にゼロで初期化されます。mmap()