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

问题描述 投票:1回答:1

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

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. 如果我希望返回的Eigen::Array拥有*output中的数据,而不是复制它,并在销毁时释放该内存块,我该如何实现?在here处,我注意到Eigen::ArrayEigen::Matrix可以使用原始数据指针进行初始化,但似乎仅适用于固定大小的数组和矩阵。该函数将经常被调用,所以我很在乎效率。
c++ eigen eigen3
1个回答
1
投票

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

您可以通过直接分配以后要返回的Array对象来简化代码(由于RVO(返回值优化),因此在任何非古老的C ++编译器上都不会有副本):] >

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对象,并通过引用将其传递给您的函数(或使其成为具有foo作为成员函数的类的成员变量)。

© www.soinside.com 2019 - 2024. All rights reserved.