英文原文(Passing Eigen objects by value to functions)
按值传递和按引用传递
按值传递:传入函数的参数是原始数据类型,被传递的值会被复制给一个局部变量,在函数执行完毕之前,局部变量会被销毁,在函数内对该参数做任何处理都不会影响外部参数。
按引用传递:传入函数的参数是引用数据类型,会把这个值在内存中的地址复制给一个局部变量,因此函数内这个局部变量的变化会反应在函数的外部。
值传递常用于从实参变量中取值(read)。引用传递常用于向实参变量中写值(write)。
使用引用传递时,实际上是向一个函数开放了对实参的写权限。
Eigen的处理
按值传递对象在 C++ 中几乎总是一个非常糟糕的用法,因为这会创建无用的副本,应该通过引用传递它们。
对于 Eigen,这一点更为重要:按值传递固定大小的可向量化 Eigen 对象不仅效率低下,而且可能是非法的或使程序崩溃!
原因是这些 Eigen 对象具有对齐修饰符,在按值传递时会不遵守这些修饰符。
例如,像这样的函数,其中向量 v
按值传递:
void my_function(Eigen::Vector2d v);
需要重写如下,通过 const
引用传递向量 v
:
void my_function(const Eigen::Vector2d& v);
同样,如果有一个以 Eigen 对象作为成员的类:
struct Foo
{
Eigen::Vector2d v;
};
void my_function(Foo v);
这个函数也需要这样改写:
void my_function(const Foo& v);
请注意,按值返回对象的函数不会存在这个问题。