【发布时间】:2021-08-30 15:42:17
【问题描述】:
我有一个结构,例如:
struct A {
double x,y;
vector<double> vec;
};
我想重载诸如加号运算符之类的运算符,以便我可以执行以下操作:
A a,b,c,d;
//do work to set up the four structs. Then:
d = a + b + c;
性能很重要,因为这些操作将在运行很多次的“内部循环”中执行。我担心 (a + b + c) 行将创建临时对象,因此不必要地将构造函数运行到“A”。 运行 C++17,编译器肯定会使用复制省略来避免创建临时对象吗?我需要运行“d=a+b+c”行,而无需运行 A 的构造函数。 p>
我知道如果我绝对可以通过写作来避免临时性:
d = a;
d += b;
d += c;
但是,实际上,我将要编写大量具有长的数学行的代码,并且能够在一行中编写所有内容(a + b + c)会更方便,而不是把它分解成大量的“+=”行。
【问题讨论】:
-
如果你的
operator+需要一个临时的来保存a + b的结果,那么你仍然会调用构造函数。 -
查看表达式模板。我怀疑复制省略会使表达式模板过时
标签: c++ copy-elision return-value-optimization