[Eigen中文文档] 按值将Eigen对象传递给函数

简介: 对于 Eigen,这一点更为重要:按值传递固定大小的可向量化 Eigen 对象不仅效率低下,而且可能是非法的或使程序崩溃!原因是这些 Eigen 对象具有对齐修饰符,在按值传递时会不遵守这些修饰符。

文档总目录

英文原文(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);

请注意,按值返回对象的函数不会存在这个问题。

相关文章
|
算法 Java C++
27.【C/C++ 最全vector数组的用法 (详解)】(一)
27.【C/C++ 最全vector数组的用法 (详解)】
311 0
|
存储 编译器
[Eigen中文文档] 深入了解 Eigen - 类层次结构
本页面介绍了Eigen类层次结构中 Core 类的设计及其相互关系。一般用户可能不需要关注这些细节,但对于高级用户和Eigen开发人员可能会有用。
309 0
|
存储 编译器 C语言
[Eigen中文文档] 对未对齐数组断言的解释
本文将解释程序因断言失败而终止的问题。
188 0
|
7月前
|
编译器 C语言 C++
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值(中)
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值
42 1
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值(中)
|
7月前
|
存储 安全 C语言
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值(上)
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值
38 2
|
7月前
|
编译器 C语言 C++
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值(下)
从C语言到C++_33(C++11_上)initializer_list+右值引用+完美转发+移动构造/赋值
45 1
|
存储 缓存
[Eigen中文文档] 深入了解 Eigen - 惰性求值与混叠(Aliasing)
Eigen具有智能的编译时机制,可以实现惰性求值并在适当的情况下删除临时变量。它会自动处理大多数情况下的混叠问题,例如矩阵乘积。自动行为可以通过使用MatrixBase::eval()和MatrixBase::noalias()方法手动覆盖。
322 0
|
存储 编译器
|
存储 C语言 C++
[Eigen中文文档] 编写以特征类型为参数的函数(一)
Eigen使用表达式模板的方式导致每个表达式的类型可能都不同。如果将这样的表达式传递给一个需要Matrix类型参数的函数,则表达式将隐式地被评估为一个临时Matrix,然后再传递给函数。这意味着失去了表达式模板的好处。
152 0