我正在将一些函数从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& a
和Matrix a
的结果作为输入之间有任何差异。)
答案 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
,并且如果您尝试,编译器会通过拒绝编译来对其进行备份。这主要是安全的事情。它可以防止细微错误引入难以检测的错误。