ben*_*b22 4 c++ memory matrix eigen
这个问题可能很愚蠢,但我是初学者。当我在这样的本地范围内创建 Eigen::MatrixXd 时:
void foo(){
Eigen::MatrixXd m(rows,cols);
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
对象会在堆上还是堆栈上?我希望它在堆栈上,因为我不使用 'new' 关键字。
Eigen::Matrix可以存储在堆或堆栈中正如接受的答案中所述,m具有自动存储期限。然而,重要的是要指出,随后的声明是
当然
Eigen::MatrixXd会动态管理它的大部分内部存储器,但您不需要关心它。
一般来说,不适用于 的专业化实例Eigen::Matrix,并且重要的是还要指出这确实是您可能想要关注的事情,特别是如果在不允许动态内存的环境中工作(例如,嵌入式环境) )。
Eigen矩阵您正在使用动态大小的矩阵(强调Xin Eigen::MatrixXd。任何Eigen::MatrixX...类型只是一个 typedef for Eigen::Matrix< ..., Dynamic , Dynamic >,其中Dynamic表示它的大小在编译时未知:
const int Eigen::Dynamic该值意味着正数(例如,大小)在编译时是未知的,而是将该值存储在某个运行时变量中。
的 Eigen 文档Eigen::Matrix,Eigen::MatrixX...都是 的特化,清楚地表明动态大小矩阵的数据将存储在堆上 [强调我的]:
固定大小与动态大小:
固定大小意味着行数和列数是编译时已知的。在这种情况下,Eigen将系数数组分配为固定大小的数组,作为类成员。...
动态大小意味着在编译时不一定知道行数或列数。在这种情况下,它们是运行时变量,系数数组在堆上动态分配。
Eigen矩阵然而,从上面引用的第一段可以清楚地看出,如果m是固定大小的Eigen::Matrix专业化,它的数据将(因为它具有自动存储持续时间)存储在堆上。这是重要的保证,例如对于不允许动态内存分配(例如嵌入)的项目。
事实上,Eigen 甚至提供了一个内部预处理器指令,EIGEN_RUNTIME_NO_MALLOC可用于禁止 Eigen 模块内的任何动态内存分配。
这些宏主要用于开发 Eigen 和测试目的的人。尽管它们可能对高级用户以及对调试和测试目的感到好奇的人有用,但它们不应该被实际代码使用。
EIGEN_RUNTIME_NO_MALLOC- 如果定义,则引入一个新开关,可以通过调用打开和关闭set_is_malloc_allowed(bool)。如果malloc不允许并且 Eigen 无论如何都尝试动态分配内存,则会导致断言失败。默认未定义。
然而,强调“不应被真实代码使用”,但它可以被 Eigen 的用户用于测试目的。
固定大小的矩阵可能仍会出现在堆上!
正如@superjax 在评论中提到的:
我要补充的最后一件事是,超过EIGEN_STACK_ALLOCATION_LIMIT 的固定大小矩阵也将在堆上分配。(默认为 128kb,但可以更改)