C++中的运算符+ for matrices

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),所以虽然它可以用于添加,但它不适用于其他一些操作.