有人可以指导我完成这个场景中的调用吗?
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的引用,但如果在自动创建的赋值运算符中没有开销,那么我宁愿坚持下去。
答案 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更复杂的优化。在我的测试中,海湾合作委员会似乎正在这样做。