c ++ - 为什么`const type&variable`作为函数输入?

scm*_*cmg 5 c++

我正在将一些函数从Matlab转换为C++,并且与矩阵有关.我在互联网上的某处发现了这个简单的功能:

typedef std::vector<std::vector<double> > Matrix;

Matrix sum(const Matrix& a, const Matrix& b) {
  size_t nrows = a.size();
  size_t ncols = a[0].size();
  Matrix c(nrows, std::vector<double>(ncols));
  for (int i = 0; i < nrows; ++i) {
    for (int j = 0; j < ncols; ++j) {
      c[i][j] = a[i][j] + b[i][j];
    }
  }
  return c;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么他们用作const Matrix& a输入,而不是Matrix a?他们是否习惯使用它,或使用它有什么好处,因为我没有看到2个版本的结果(const Matrix& aMatrix a输入)之间有任何差异.

Aja*_*jay 6

  • 参考是避免复制大尺寸对象.但是,对于小对象,更优选的是具有非引用,因为引用创建将产生比其保存更多的开销.例如<=pointer-size,给定平台上的数据类型.
  • const是为了确保给定的对象不会被函数更改,这是程序员编写给定函数的安全检查,是调用者的合同.它还使调用者传递非const和const对象.
  • 有些人可能会争辩说const没有参考就没有意义(因为原始对象无论如何都不会被修改).但是,作为一个安全网,建议函数实现者使用const参数,这样错误的函数不会改变它的参数.这就是原因,constness默认情况下有些函数式语言(除非你让它们变得可变).


use*_*301 5

如果不分析代码并寻找性能差异,您将看不到幕后发生的事情。

参数Matrix a是按值传递的。源Matrix将被复制到Matrix a,并且根据矩阵的大小,这可能需要一段时间。3x3 矩阵并不多,但如果它发生很多……如果你有一个 300x300 矩阵而不是 3x3,那就需要大量的向量构建和数据复制。可能会成为性能杀手。几乎可以肯定,它会比函数的按引用传递版本花费更长的时间,const Matrix& a后者只会复制源地址Matrix,除非编译器发现执行自身复制有一些优势Matrix

因此,您可以使用Matrix & a,但这允许该函数使用 的内容Matrix a,可能会损害调用函数。更改声明以向const Matrix & a调用者承诺a不会在函数内部更改,并且如果您尝试,编译器会通过拒绝编译来支持这一点。这主要是出于安全考虑。它可以防止出现细微错误而引入难以检测的错误。