繁体   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