自动分配操作员构造

时间:2012-05-11 14:06:19

标签: c++

有人可以指导我完成这个场景中的调用吗?

template<class T>
class mat4 {
public :

T matrix[4][4];

    mat4();
    mat4(vec4<T> i, vec4<T> j, vec4<T> k, vec4<T> t);
    mat4(const T input_matrix[4][4]);

    //~mat4();

    mat4<T> Transposed() const;
    void Transpose();

    mat4<T> Inversed() const;
    void Inverse();

};

如果我打电话给上面的代码

mat4<float> matrix;
float mf[4][4];

//fill the float matrix here

matrix = mf;

然后我知道第3个构造函数被调用(它不是显式的),但旁边有什么叫做?矩阵的复制构造函数,它接受从赋值操作创建的临时对象?我正在讨论是否应该为它创建一个自定义赋值运算符,或者只是让它自己处理。自定义运算符只会将矩阵复制到mat4中并返回对mat4的引用,但如果在自动创建的赋值运算符中没有开销,那么我宁愿坚持下去。

2 个答案:

答案 0 :(得分:1)

任何体面的return value optimization都应该将其简化为对第三个构造函数的调用。只要您使用优化进行编译,就不需要降低可读性以减少这种情况下的开销。

另外,我没有看到自定义复制构造函数和/或赋值运算符的开销如何比编译器生成的开销运算符少;它们甚至可能使优化变得复杂。

答案 1 :(得分:0)

如果此矩阵持有std::vector<T>(16);,则现代隐式生成的赋值运算符将“窃取”从mf创建的临时内容,并避免使用第二个副本。对于较旧的编译器,您可以自己编写这样的赋值运算符(参见What is the copy-and-swap idiom?)。

但是,此矩阵将数组作为数据成员保存:隐式生成的赋值运算符,就像您可以编写的任何赋值运算符一样,必须实际复制(或移动,如果T可移动)16 T值中的每一个单独(或单个memcpy,如果T是可以轻易复制的)。编译器实际上可以优化临时并将所有16 Ts直接从mf复制到matrix.matrix,但这是一个比简单的RVO更复杂的优化。在我的测试中,海湾合作委员会似乎正在这样做。