Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Eigen::Map构造Eigen::Array,它是如何工作的?_C++_Eigen_Eigen3 - Fatal编程技术网

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

C++ 从Eigen::Map构造Eigen::Array,它是如何工作的?,c++,eigen,eigen3,C++,Eigen,Eigen3,在我的项目中,我编写了以下代码: 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()); } Eigen::ArrayXf foo(const Eigen::ArrayXcf&src

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

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());
}
Eigen::ArrayXf foo(const Eigen::ArrayXcf&src)
{
auto*output=newfloat[src.size()];
//在这里填写数据
返回Eigen::Map(输出,src.size());
}
注意,在return语句中构造的东西是一个
Eigen::Map
,但编译器不会抱怨任何事情,所以必须进行转换。因此,我有以下问题:

  • 这种转换是如何发生的?通过制作原始数据的深度拷贝还是仅仅改变所有权
  • 这个代码行吗?它是否会导致未定义的行为或内存泄漏
  • 如果我希望返回的
    Eigen::Array
    拥有
    *output
    中的数据,而不是复制它,并在销毁时释放此内存块,我如何实现这一点?我注意到,
    Eigen::Array
    Eigen::Matrix
    可以用原始数据指针初始化,但它似乎只适用于固定大小的数组和矩阵。这个函数将被频繁调用,所以我非常关心效率

  • ArrayXf
    有一个来自
    Map
    的隐式构造函数(实际上来自任何
    ArrayBase
    对象),它生成内容的深度副本。 从Eigen的角度来看,您的代码是安全的,但是您会泄漏内存,因为您从未取消分配
    float*输出
    数据。通常,在编写干净的C++代码时,应避免<代码>新< /C> >至少封装。< /P> <>你可以通过直接分配你想返回的<>代码>数组< /Cord>对象,使你的代码变得更容易(因为RVO(返回值优化),不会有任何非古C++编译器的拷贝:


    如果希望完全避免内存分配(函数内部),则需要详细说明实际分配内存的位置。您可以在该位置构造一个
    数组
    对象,并通过引用将其传递给您的函数(或使其成为一个类的成员变量,该类将
    foo
    作为成员函数)。

    谢谢,这非常有帮助。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;
    }