2

次のように設計された数学ベクトルクラスがあります。

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で得られた結果です。

  1. 現状のまま(コンストラクターとカスタムコピーコンストラクターでのメンバーの割り当て):

    Median:       634860 ns
    Median, CPI:  15.8715 ns
    Average:      636614 ns
    Average, CPI: 15.9154 ns 
    
  2. コンストラクター初期化子リストとカスタムコピーコンストラクターの使用:

    Median:       634928 ns
    Median, CPI:  15.8732 ns
    Average:      636312 ns
    Average, CPI: 15.9078 ns
    
  3. コンストラクター初期化子リストとデフォルトのコピーコンストラクターの使用:

    Median:       860337 ns
    Median, CPI:  21.5084 ns
    Average:      864391 ns
    Average, CPI: 21.6098 ns
    

結論のいくつか:

  • 上記の数学ベクトルクラスの場合、コンストラクター初期化子リストはメンバー変数の割り当てを高速化しません。
  • カスタムコピーコンストラクターは、デフォルトのコピーコンストラクターよりも35%以上高速です。
4

1 に答える 1

6

中括弧の初期化はあらゆる種類のコンストラクターで機能します。この場合、initializer-listコンストラクター引数は必要ありません。逆に、初期化子リストは、動的コンテナーのコンテンツなどの可変コンテンツ用ですが、固定長コンストラクター引数用ではありません。だからあなたはただ言うことができます:

vector3D v { 1, 1, 1 };

そして、すべてがうまくいくでしょう。

ただし、クラスメンバーを割り当てるのではなく、実際に初期化する必要があることに注意してください。

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]) { }

また、デフォルトで提供されているものよりも優れているわけではないため、コピーコンストラクターを作成しないでください。代入演算子についても同じことが言えます。

float[](個人的には、コンストラクターに慣れていません。 std::array<float, 3>;を使用する方がよいでしょう。しかし、この場合も、最初から3Dベクトル型などの配列を使用するだけで、カスタムクラスを作成する必要はありません。 。)

最後に、ベクトルのリストを作成するこの最後の例で、construct-initializer-listsとinitializer-list-constructorsを組み合わせることができます。

std::list<Vector3D> l { { 1.0, 2.0, 3.0}, { 1.5, 3.0, 4.4 }, { 0.0, -1.2, 4.1 } };
于 2012-02-03T22:02:14.993 に答える