这个问题可能很愚蠢,但是我是初学者。 当我在本地范围内创建Eigen :: MatrixXd时:
void foo(){
Eigen::MatrixXd m(rows,cols);
// do stuff
}
对象将位于堆还是堆栈上? 我希望它可以放在堆栈中,因为我不使用'new'关键字。
答案 0 :(得分:3)
m
具有自动存储期限,就像以这种方式声明的任何其他类型一样。
当然Eigen::MatrixXd
将动态管理其内部大部分内存,但是您不必为此担心。
答案 1 :(得分:1)
Eigen::Matrix
专业化实例可以存储在堆中或堆栈中如the accepted answer中所述,m
具有自动存储期限。重要的是要指出,但是,随后的声明
当然
Eigen::MatrixXd
将动态管理其内部大部分内存,但是您不必为此担心。
通常不适用于Eigen::Matrix
的特殊情况,并且还必须指出,这确实是您可能要关注的事情,尤其是在动态内存环境中工作时是不允许的(例如,嵌入式环境)。
Eigen
矩阵您使用的是动态尺寸的矩阵(强调Eigen::MatrixXd
中的 X
。任何Eigen::MatrixX...
类型只是{{1} },其中Dynamic
表示在编译时未知其大小:
Eigen::Matrix< ..., Dynamic , Dynamic >
此值表示在编译时未知正数(例如大小),而是将该值存储在某个运行时变量中。
所有const int Eigen::Dynamic
都属于Eigen::Matrix
的本征文档表明,动态大小的矩阵的数据将存储在堆中[强调我的]:
固定尺寸与动态尺寸:
固定大小表示已知行数和列数 编译时。在这种情况下,本征分配 系数作为固定大小的数组,作为类成员。 ...
动态大小表示行数或列数不 必须在编译时知道。在这种情况下,它们是运行时 变量,并且系数的数组在 堆。
Eigen::MatrixX...
矩阵从上面引用的第一段中可以清楚地看到,如果Eigen
是固定大小的m
专长,则将存储其数据(因为它具有自动存储时间)在堆上。这是重要的保证,例如用于不允许动态内存分配(例如嵌入式)的项目。
实际上,Eigen甚至提供了一个内部预处理器指令Eigen::Matrix
,该指令可用于禁止Eigen模块内的任何动态内存分配。
这些宏主要用于开发Eigen和 测试目的。即使它们可能对高级用户也有用 并且出于调试和测试目的而好奇,他们 用于实词代码。
EIGEN_RUNTIME_NO_MALLOC
-如果已定义,则引入新的开关 可以通过调用打开和关闭EIGEN_RUNTIME_NO_MALLOC
。如果不允许set_is_malloc_allowed(bool)
并且本征 尝试以任何方式动态分配内存,断言失败 结果。默认情况下未定义。
但是,“ 不应由实词代码使用 强调,但Eigen用户可以将其用于测试目的。
答案 2 :(得分:0)
Eigen 库中固定大小的对象
所有固定大小的对象,例如Matrix2f、Vector3f 等使用在堆栈上声明的数组进行分配。如果您查看 Eigen/src/Core/DenseStorage.h,
struct plain_array
{
T array[Size];
...
特征库中的动态大小对象
动态大小对象(以及在运行时创建的中间对象)使用 malloc()/realloc() 获取它们的内存。您可以在 Eigen/src/Core/util/Memory.h
中检查它