[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);

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

相关文章
|
存储 编译器
[Eigen中文文档] 深入了解 Eigen - 类层次结构
本页面介绍了Eigen类层次结构中 Core 类的设计及其相互关系。一般用户可能不需要关注这些细节,但对于高级用户和Eigen开发人员可能会有用。
303 0
|
存储 编译器 C语言
[Eigen中文文档] 对未对齐数组断言的解释
本文将解释程序因断言失败而终止的问题。
179 0
|
存储 算法 NoSQL
[Eigen中文文档] 存储顺序
矩阵和二维数组有两种不同的存储顺序:列优先和行优先。本节解释了这些存储顺序以及如何指定应该使用哪一种。
180 0
|
4月前
|
Python
创建常量tensor
【8月更文挑战第11天】创建常量tensor。
63 5
|
存储 缓存
[Eigen中文文档] 深入了解 Eigen - 惰性求值与混叠(Aliasing)
Eigen具有智能的编译时机制,可以实现惰性求值并在适当的情况下删除临时变量。它会自动处理大多数情况下的混叠问题,例如矩阵乘积。自动行为可以通过使用MatrixBase::eval()和MatrixBase::noalias()方法手动覆盖。
312 0
[Eigen中文文档] 编写以特征类型为参数的函数(一)
Eigen使用表达式模板的方式导致每个表达式的类型可能都不同。如果将这样的表达式传递给一个需要Matrix类型参数的函数,则表达式将隐式地被评估为一个临时Matrix,然后再传递给函数。这意味着失去了表达式模板的好处。
151 0
|
存储 编译器
|
存储 C语言 C++
|
存储 算法 NoSQL
[Eigen中文文档] 稀疏矩阵操作
在许多应用中(例如,有限元方法),通常要处理非常大的矩阵,其中只有少数系数不为零。在这种情况下,可以通过使用仅存储非零系数的特殊表示来减少内存消耗并提高性能。这样的矩阵称为稀疏矩阵。
488 0
|
7月前
|
JavaScript
函数形状有几种定义方式;操作符infer的作用
函数形状有几种定义方式;操作符infer的作用
49 3