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

时间:2016-04-02 06:24:10

标签: 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;
}

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

您没有看到的是没有分析代码,并且在幕后发生的事情中寻找性能上的差异。

Matrix a参数是按值传递的。源Matrix将被复制到Matrix a,并且根据矩阵的大小,这可能需要一段时间。一个3x3的矩阵并不多,但如果它发生了很多......如果不是3x3而你有300x300矩阵,那就是很多矢量构造和数据复制。可能会成为一个性能杀手。它几乎可以肯定需要比函数const Matrix& a的参考版本传递更长的时间,它只会复制源Matrix的地址,除非编译器在执行{{{}}副本时看到一些优点。 1}}本身。

所以你可以使用Matrix,但这允许函数使用Matrix & a的内容,可能会损害调用函数。将声明更改为Matrix a会使调用者承诺在函数内部不会更改const Matrix & a,并且如果您尝试,编译器会通过拒绝编译来对其进行备份。这主要是安全的事情。它可以防止细微错误引入难以检测的错误。