我正在使用第三方 C++ 库在 Julia 中完成一些繁重的工作。在 Julia 方面,数据存储在 Array{Float64, 2}
类型的对象中(这大致类似于 double 的二维数组)。我可以使用指向 double
的指针将它传递给 C++。然而,在 C++ 端,数据存储在名为 vector3
的结构中:
typedef struct _vector3
{
double x, y, z;
} vector3;
我的快速而肮脏的方法是一个五步过程:
- 在 C++ 端动态分配结构数组
- 将输入数据从
double*
复制到vector3*
- 做繁重的工作
- 将输出数据从
vector3*
复制到double*
- 删除动态分配的数组
复制大量数据是非常低效的。我可以使用一些神秘的技巧来避免将数据从 double
复制到 struct
并返回吗?我想以某种方式将 double
的一维数组(大小是 3 的倍数)解释为具有 3 个 double
成员的结构的一维数组。
最佳答案
不幸的是,不,你不能。这是因为 aliasing rule C++ 有。简而言之,如果您有一个对象 T
,您就不能从不兼容类型 U
的指针合法地访问它。从这个意义上说,您不能通过类型为 struct _vector3
的指针访问类型为 double
或 double*
的对象,反之亦然。
如果您深入挖掘,您会发现 reinterpret_cast
并且可能会想“哦,这正是我需要的”,但事实并非如此。无论您使用什么技巧(reinterpret_cast
或其他方式)来绕过语言限制(也称为只需编译),事实仍然是您可以合法访问仅通过 double
类型的指针输入 double
。
一个经常用于 type-pune 的技巧是使用 union
。在 C
中是合法的,但在 C++ 中是非法的,但一些编译器允许它。但是,在您的情况下,我认为没有办法使用 union 。
理想的情况是直接对 double*
数据执行繁重的工作。如果这在您的工作流程中可行。
关于c++ - 将 double 组转换为仅具有 double 成员的结构数组而不复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356587/