次のように設計された数学ベクトルクラスがあります。
class Vector3D {
public:
float x;
float y;
float z;
public:
Vector3D() {}
Vector3D(float xx, float yy, float zz = 0.0) { x=xx; y=yy; z=zz; }
Vector3D(const float v[]) { x=v[0]; y=v[1]; z=v[2]; }
Vector3D(const Vector3D& v) { x=v.x; y=v.y; z=v.z; }
// math member methods
// ...
};
以前は、スタック上にVector3D型変数を作成するために以下を使用していました。
Vector3D vec1 = Vector3D(1.0, 1.0, 1.0);
イニシャライザリストコンストラクタを実装することで、C ++ 0xでこれを短縮できると聞いたので、次のように書くことができます。
Vector3D vec1 = { 1.0, 1.0, 1.0 };
これを実装する正しい方法は何ですか?
アップデート
中括弧の構文は、このクラスの箱から出してすぐに機能します。答えとコメントをありがとう!
また、コンストラクター初期化子リストがコンストラクターでのメンバー変数の割り当てよりも高速化されるかどうかを測定するために、いくつかの合成パフォーマンステストを実行しました。以下は、g++4.6.1で得られた結果です。
現状のまま(コンストラクターとカスタムコピーコンストラクターでのメンバーの割り当て):
Median: 634860 ns Median, CPI: 15.8715 ns Average: 636614 ns Average, CPI: 15.9154 ns
コンストラクター初期化子リストとカスタムコピーコンストラクターの使用:
Median: 634928 ns Median, CPI: 15.8732 ns Average: 636312 ns Average, CPI: 15.9078 ns
コンストラクター初期化子リストとデフォルトのコピーコンストラクターの使用:
Median: 860337 ns Median, CPI: 21.5084 ns Average: 864391 ns Average, CPI: 21.6098 ns
結論のいくつか:
- 上記の数学ベクトルクラスの場合、コンストラクター初期化子リストはメンバー変数の割り当てを高速化しません。
- カスタムコピーコンストラクターは、デフォルトのコピーコンストラクターよりも35%以上高速です。