簡體   English   中英

使數學向量類成為初始化器列表

[英]Make a math vector class to be initializer list aware

我有一個數學向量類,其設計如下:

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%以上。

括號初始化適用於各種構造函數,在這種情況下,您不需要初始化列表構造函數參數。 相反,初始化列表用於變量內容,例如動態容器的內容,但不適用於固定長度的構造函數參數。 所以你可以說:

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 } };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM