是否在堆上自动创建了特征矩阵?

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' 关键字。

dfr*_*fri 6

的特化实例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::MatrixEigen::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,但可以更改)

  • 我要补充的最后一件事是,超过 [`EIGEN_STACK_ALLOCATION_LIMIT`](https://eigen.tuxfamily.org/dox/TopicPreprocessorDirectives.html) 的固定大小矩阵也将在堆上分配。(默认为 128kb,但可以更改) (3认同)

Bat*_*eba 1

m与以这种方式声明的任何其他类型一样具有自动存储持续时间。

当然Eigen::MatrixXd会动态管理其大部分内部内存,但您不需要关心这一点。