从 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
,但编译器不会抱怨任何内容,因此必须进行转换。因此我有以下问题:
- 这种转换是如何发生的?通过对原始数据进行深层复制或仅更改所有权?
- 这个代码可以吗?它会导致未定义的行为或内存泄漏吗?
- 如果我想让 returned
Eigen::Array
拥有 *output
中的数据而不是复制它,并在销毁时释放这块内存,我该如何实现呢?在 here 我注意到 Eigen::Array
和 Eigen::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
作为成员函数)。
在我的项目中,我编写了以下代码:
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
,但编译器不会抱怨任何内容,因此必须进行转换。因此我有以下问题:
- 这种转换是如何发生的?通过对原始数据进行深层复制或仅更改所有权?
- 这个代码可以吗?它会导致未定义的行为或内存泄漏吗?
- 如果我想让 returned
Eigen::Array
拥有*output
中的数据而不是复制它,并在销毁时释放这块内存,我该如何实现呢?在 here 我注意到Eigen::Array
和Eigen::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
作为成员函数)。