从 Eigen::Map 构造 Eigen::Array,它是如何工作的?

Constructing Eigen::Array from Eigen::Map, how does it work?

在我的项目中,我编写了以下代码:

Eigen::ArrayXf foo(const Eigen::ArrayXcf &src)
{
    auto * output = new float[src.size()];
    //Fill the data here
    return Eigen::Map<Eigen::ArrayXf>(output, src.size());
}

请注意,在 return 语句中构造的内容是 Eigen::Map,但编译器不会抱怨任何内容,因此必须进行转换。因此我有以下问题:

  1. 这种转换是如何发生的?通过对原始数据进行深层复制或仅更改所有权?
  2. 这个代码可以吗?它会导致未定义的行为或内存泄漏吗?
  3. 如果我想让 returned Eigen::Array 拥有 *output 中的数据而不是复制它,并在销毁时释放这块内存,我该如何实现呢?在 here 我注意到 Eigen::ArrayEigen::Matrix 可以用原始数据指针初始化,但它似乎只适用于固定大小的数组和矩阵。这个函数会被频繁调用所以我比较在意效率

ArrayXf 有一个来自 Map<ArrayXf> 的隐式构造函数(实际上来自任何 ArrayBase<...> 对象),它对内容进行深度复制。 从 Eigen 的角度来看,您的代码是安全的,但是您会泄漏内存,因为您永远不会取消分配 float* output 数据。通常,在编写干净的 C++ 代码时,应避免或至少封装 new

你可以让你的代码更简单,通过直接分配你想要的 Array 对象到 return 之后(在任何非古老的 ​​C++ 编译器上都不会有一个副本,因为RVO(return值优化):

Eigen::ArrayXf foo(const Eigen::ArrayXcf &src)
{
    Eigen::ArrayXf output_array(src.size());
    float * output = output_array.data();
    //Fill the data here
    return output_array;
}

如果您想完全避免内存分配(在函数内部),您需要详细说明实际分配内存的位置。你可以在那个地方构造一个 Array 对象并通过引用传递给你的函数(或者使它成为 class 的成员变量,其中 foo 作为成员函数)。