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

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

相关文章
|
存储 编译器 C语言
[Eigen中文文档] 对未对齐数组断言的解释
本文将解释程序因断言失败而终止的问题。
665 0
|
编译器 索引
[Eigen中文文档] 块操作
本文介绍了块操作。块是matrix或array的部分矩形元素。块表达式既可以用作右值也可以用作左值。与Eigen表达式一样,如果让编译器进行优化,则块操作的运行时间成本为零。
581 0
|
XML 并行计算 算法
[Eigen中文文档] 求解稀疏线性系统
在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示,必须特别小心以获得良好的性能。本文列出了Eigen中可用的稀疏求解器。还介绍了所有这些线性求解器共同的主要步骤。根据矩阵的属性、所需的准确度,最终用户可以调整这些步骤以提高其代码的性能。请注意,并不需要深入了解这些步骤背后的内容:最后一节介绍了一个基础例程,可轻松使用以获取所有可用求解器的性能洞察。
1210 0
|
缓存 测试技术 编译器
[Eigen中文文档] 稠密矩阵分解函数对比
本文介绍了 Eigen 为各种方阵和过约束问题提供的稠密矩阵分解的速度比较。
643 0
|
存储 安全 编译器
[Eigen中文文档] 常见的陷阱
本文将介绍一些Eigen常见的陷阱
916 0
|
存储 算法 NoSQL
[Eigen中文文档] 稀疏矩阵操作
在许多应用中(例如,有限元方法),通常要处理非常大的矩阵,其中只有少数系数不为零。在这种情况下,可以通过使用仅存储非零系数的特殊表示来减少内存消耗并提高性能。这样的矩阵称为稀疏矩阵。
1149 0
|
安全 编译器 C++
[Eigen中文文档] 矩阵与向量运算
本文章旨在提供有关如何使用 Eigen 在矩阵、向量和标量之间执行算术操作的概述和一些详细信息。
1202 0
|
存储 NoSQL API
[Eigen中文文档] Matrix类
在Eigen中,所有矩阵和向量都是Matrix模板类的对象。向量只是行数或者列数为1的特殊矩阵。
1181 1
|
存储 并行计算 算法
[Eigen中文文档] 概述(总目录)
Eigen是基于线性代数的C ++模板库,主要用于矩阵,向量,数值求解器和相关算法。常用的Ceres、G2O等项目均是基于Eigen库。 本系列文章将通过官方文档带你了解Eigen。
3774 1
|
存储 算法 API
[Eigen中文文档] 空间变换
本页将介绍几何模块提供的多种处理 2D 和 3D 旋转以及射影或仿射变换的方法。
721 0