Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动赋值运算符构造_C++ - Fatal编程技术网

C++ 自动赋值运算符构造

C++ 自动赋值运算符构造,c++,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> Tr

有人能给我介绍一下这个场景中被称为什么吗

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类{
公众:
T矩阵[4][4];
mat4();
mat4(vec4i,vec4j,vec4k,vec4t);
mat4(常数输入_矩阵[4][4]);
//~mat4();
mat4转置()常数;
无效转置();
mat4逆()常数;
void逆();
};
如果我调用

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

//fill the float matrix here

matrix = mf;
mat4矩阵;
浮动mf[4][4];
//在这里填写浮点矩阵
矩阵=mf;
然后我知道调用了第三个构造函数(它不是显式的),但是除了它之外还调用了什么呢?获取从赋值操作创建的临时对象的矩阵的副本构造函数?我在争论是应该为它创建一个自定义赋值操作符,还是让它自己处理。自定义运算符只会将矩阵复制到mat4中并返回对mat4的引用,但是如果自动创建的赋值运算符中没有开销,那么我宁愿坚持使用它。

任何适当的操作都应该将其简化为只调用第三个构造函数。在这种情况下,只要使用优化进行编译,就不需要降低可读性来减少开销


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

如果该矩阵包含
std::vector(16)
,现代隐式生成的赋值运算符将“窃取”从
mf
创建的临时对象的内容,并将避免第二个副本。对于较旧的编译器,您可以自己编写这样的赋值运算符(请参阅)

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