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

时间:2019-05-03 08:31:45

标签: c++ matrix memory eigen

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

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

对象将位于堆还是堆栈上? 我希望它可以放在堆栈中,因为我不使用'new'关键字。

3 个答案:

答案 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

中检查它