cib*_*en1 5 c++ operators matrix
我想在C++中对矩阵(例如2D)的+运算符的朴素实现将是:
class Matrix {
Matrix operator+ (const Matrix & other) const {
Matrix result;
// fill result with *this.data plus other.data
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我们可以像使用它一样
Matrix a;
Matrix b;
Matrix c;
c = a + b;
Run Code Online (Sandbox Code Playgroud)
对?
但是如果矩阵很大,那么效率就不高,因为我们正在做一个不必要的复制(返回结果).
因此,如果我们不高效,我们必须忘记干净的电话:
c = a + b;
Run Code Online (Sandbox Code Playgroud)
对?
你会建议/更喜欢什么?谢谢.
Jer*_*fin 12
在这种情况下,C++标准允许编译器忽略不必要的副本(它被称为"命名返回值优化",通常缩写为NRVO).当您返回临时变量而不是命名变量时,会出现匹配的"RVO".
几乎所有合理的C++编译器都实现了NRVO和RVO,所以一般来说,你可以忽略这样一个事实,即这个结构不会特别有效.
编辑:我当然是在讨论返回新矩阵所涉及的副本,其中包含了添加的结果.你可能也想要么路过常引用输入:
Matrix operator+(Matrix const &other) const {
Matrix result;
// ...
return result;
}
Run Code Online (Sandbox Code Playgroud)
...或者,按值传递,但返回传递的值:
Matrix operator+(Matrix other) const {
other += *this;
return other;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这取决于交换性(即,它确实在做b+a而不是a+b),所以虽然它可以用于添加,但它不适用于其他一些操作.