【发布时间】:2017-03-29 13:02:00
【问题描述】:
所以,我有一个 C++ Matrix 类,并且有一些重载的运算符(如 +、*、%、-atc...),它们看起来像这样:
Matrix operator*(const Matrix& b) const;
他们正在返回 Matrix 类型的 TMP 对象,然后它被复制,这会降低性能。
如果我做类似的事情
Matrix some = a*b + c*d - (i+j)*m*b; //[1]
大约有 6 个复制构造函数被调用。
所以,我看到 ppl 做了一些模板元编程,将 [1] 扩展为类似:
Matrix some = ((a*b)+=(c*d))-=(((i+j)*=m)*=b); //[2]
[2] 处的代码将调用大约 3 个复制构造函数。(*=、+= 将结果写入左操作数并返回其链接)
你们能否解释一下,我如何通过模板来做到这一点,或者我应该阅读什么来理解如何做到这一点。
【问题讨论】:
-
"...然后它被复制了,这会降低性能。" 阅读 NRVO/RVO en.wikipedia.org/wiki/Return_value_optimization 。大多数现代编译器现在都在实现这一点。
-
除了编译器的返回值优化和复制省略之外,您还可以实现移动运算符和
std::move返回的对象。 -
"about 6" 测量优化构建时实际调用了多少复制构造函数。你可能会感到惊讶。
-
调用了 zero 个复制构造函数,而不是 6。将一些输出放入复制构造函数中,使用
/O2或任何调用编译器的标志进行编译,然后自己看看.
标签: c++ templates optimization operator-overloading