c++ - 从 Eigen::Map 构造 Eigen::Array,它是如何工作的?
问题描述
在我的项目中,我编写了以下代码:
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
,但编译器不会抱怨任何东西,因此必须进行转换。因此,我有以下问题:
- 这种转换是如何发生的?通过制作原始数据的深层副本或只是更改所有权?
- 这段代码可以吗?它会导致未定义的行为或内存泄漏吗?
- 如果我希望返回的
Eigen::Array
拥有数据*output
而不是复制它,并在销毁时释放这块内存,我该如何实现呢?在这里我注意到Eigen::Array
并且Eigen::Matrix
可以使用原始数据指针进行初始化,但它似乎只适用于固定大小的数组和矩阵。这个函数会被频繁调用,所以我很关心效率。
解决方案
ArrayXf
Map<ArrayXf>
有一个来自(实际上来自任何对象)的隐式构造函数,ArrayBase<...>
它对内容进行深层复制。从 Eigen 的角度来看,您的代码是安全的,但是您会泄漏内存,因为您永远不会取消分配float* output
数据。通常,new
在编写干净的 C++ 代码时应该避免或至少封装。
您可以通过直接分配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
作为成员函数的类的成员变量)。
推荐阅读
- php - 使用 Visual Studio 2012 编译 PHP 时出错
- sed - GDB:如何从变量中删除/替换模式?
- python - 将 Python 函数应用于每一行并追加
- java - 如何在两个片段之间进行通信
- windows - 将 git log 的输出分配给 powershell 变量
- git - 在我的私人存储库中推送代码时出错
- javascript - 我对用于选择随机数的逻辑感到困惑
- postgresql - postgreSQL 服务器未加载
- haskell - Haskell Data.HashMap.Strict.InsOrd 能够检索最后一个元素
- javascript - 在 javascripts 和 php 中连接数字