是在堆上自动创建的特征矩阵吗?

Is an Eigen matrix created automatically on the heap?

这个问题可能很愚蠢,但我是初学者。 当我在这样的本地范围内创建 Eigen::MatrixXd 时:

    void foo(){
        Eigen::MatrixXd m(rows,cols);
        // do stuff
    }

对象是在堆上还是栈上? 我希望它在堆栈上,因为我不使用 'new' 关键字。

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

当然 Eigen::MatrixXd 会动态管理它的大部分内部内存,但你不需要关心这个。

Eigen::Matrix 的特化实例可以存储在堆或堆栈上

所述,m具有自动存储期限。然而,重要的是要指出

Of course Eigen::MatrixXd will manage much of its internal memory dynamically, but you do not need to concern yourself with that.

通常不适用于 Eigen::Matrix 的专业化实例,并且重要的是还要指出这确实是您可能想要关注的事情,特别是如果您在以下环境中工作不允许使用动态内存(例如,嵌入式环境)。

Dynamic-sized Eigen 矩阵

您正在使用 dynamically-sized 矩阵(在 Eigen::MatrixXd. Any Eigen::MatrixX... type is just a typedef for Eigen::Matrix< ..., Dynamic , Dynamic >, where Dynamic 中强调 X 表示其大小在 compile-time:

const int Eigen::Dynamic

This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is stored in some runtime variable.

Eigen::Matrix 的 Eigen 文档,所有 Eigen::MatrixX... 都是特化的,清楚地表明 dynamic-sized 矩阵的数据将存储在堆上 [强调我的]:

Fixed-size versus dynamic-size:

Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates the array of coefficients as a fixed-size array, as a class member. ...

Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they are runtime variables, and the array of coefficients is allocated dynamically on the heap.

Fixed-sized Eigen 矩阵

然而,从上面引用的第一段可以清楚地看出,如果 m 是 fixed-size Eigen::Matrix 专业化,其数据将是(因为它具有自动存储持续时间)存储在堆上。这是重要的保证。对于不允许动态内存分配的项目(例如嵌入式)。

事实上,Eigen 甚至提供了一个内部预处理器指令,EIGEN_RUNTIME_NO_MALLOC,可用于禁止 Eigen 模块内的任何动态内存分配。

These macros are mainly meant for people developing Eigen and for testing purposes. Even though, they might be useful for power users and the curious for debugging and testing purpose, they should not be used by real-word code.

EIGEN_RUNTIME_NO_MALLOC - if defined, a new switch is introduced which can be turned on and off by calling set_is_malloc_allowed(bool). If malloc is not allowed and Eigen tries to allocate memory dynamically anyway, an assertion failure results. Not defined by default.

然而,强调不应该被real-word代码使用,但它可以被使用用于测试目的的 Eigen 用户。

Fixed-size 矩阵可能仍然在堆上结束!

@superjax 在评论中提到:

One last thing I would add is that fixed-size matrices exceeding the EIGEN_STACK_ALLOCATION_LIMIT will also be allocated on the heap. (The default is 128kb, but that can be changed)

Eigen 库中固定大小的对象

所有固定大小的对象,例如Matrix2f、Vector3f 等使用声明在堆栈上的数组进行分配。如果你查看 Eigen/src/Core/DenseStorage.h,

struct plain_array
{
  T array[Size];
  ...

Eigen 库中的动态大小对象

动态大小对象(以及在 运行 期间创建的中间对象)使用 malloc()/realloc() 获取内存。你可以在Eigen/src/Core/util/Memory.h

中查看