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;
}