0

有人可以指导我完成这种情况下的调用吗?

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;

然后我知道第三个构造函数被调用(它不是明确的),但除此之外还有什么?矩阵的复制构造函数,它采用从赋值操作创建的临时对象?我正在争论我是否应该为它创建一个自定义分配运算符,或者让它自己处理。自定义运算符只会将矩阵复制到 mat4 并返回对 mat4 的引用,但如果自动创建的赋值运算符没有开销,那么我宁愿坚持下去。

4

2 回答 2

1

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

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

于 2012-05-11T14:20:30.170 回答
0

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

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

于 2012-05-11T14:48:43.673 回答