c++ - 将 double 组转换为仅具有 double 成员的结构数组而不复制数据

标签 c++ struct casting julia

我正在使用第三方 C++ 库在 Julia 中完成一些繁重的工作。在 Julia 方面,数据存储在 Array{Float64, 2} 类型的对象中(这大致类似于 double 的二维数组)。我可以使用指向 double 的指针将它传递给 C++。然而,在 C++ 端,数据存储在名为 vector3 的结构中:

typedef struct _vector3
{
    double x, y, z;
} vector3;

我的快速而肮脏的方法是一个五步过程:

  1. 在 C++ 端动态分配结构数组
  2. 将输入数据从 double* 复制到 vector3*
  3. 做繁重的工作
  4. 将输出数据从 vector3* 复制到 double*
  5. 删除动态分配的数组

复制大量数据是非常低效的。我可以使用一些神秘的技巧来避免将数据从 double 复制到 struct 并返回吗?我想以某种方式将 double 的一维数组(大小是 3 的倍数)解释为具有 3 个 double 成员的结构的一维数组。

最佳答案

不幸的是,不,你不能。这是因为 aliasing rule C++ 有。简而言之,如果您有一个对象 T,您就不能从不兼容类型 U 的指针合法地访问它。从这个意义上说,您不能通过类型为 struct _vector3 的指针访问类型为 doubledouble* 的对象,反之亦然。

如果您深入挖掘,您会发现 reinterpret_cast 并且可能会想“哦,这正是我需要的”,但事实并非如此。无论您使用什么技巧(reinterpret_cast 或其他方式)来绕过语言限制(也称为只需编译),事实仍然是您可以合法访问仅通过 double 类型的指针输入 double

一个经常用于 type-pune 的技巧是使用 union。在 C 中是合法的,但在 C++ 中是非法的,但一些编译器允许它。但是,在您的情况下,我认为没有办法使用 union 。

理想的情况是直接对 double* 数据执行繁重的工作。如果这在您的工作流程中可行。

关于c++ - 将 double 组转换为仅具有 double 成员的结构数组而不复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356587/

相关文章:

C++ 如何将成员函数指针传递给另一个类?

c++ - 结构继承 : implicitly public or private?

c - 如何将字符串数组传递给 C 中的函数?

java - Java 中的类型转换作为缺少泛型数组的解决方法

c++ - C++ 模板的 Vim 缩进?

c - 返回指针时,什么时候数据需要是静态的?

c - 包含指向其他结构的指针的堆栈

Golang - 将 uint 转换为 os.FileMode

android - ClassCastException - Parcelable 对象/自定义对象

c++ - 适用于 Linux 的 C/C++ RPC 教程