将双精度数组转换为仅具有双成员而不复制数据的结构数组

mtg*_*ves 6 c++ struct casting julia

我正在使用第三方C++库在Julia中做一些繁重的工作.在Julia方面,数据存储在类型的对象中Array{Float64, 2}(这大致类似于2D数组的双精度数).我可以使用指向a的指针将它传递给C++ double.但是,在C++方面,数据存储在一个名为的结构中vector3:

typedef struct _vector3
{
    double x, y, z;
} vector3;
Run Code Online (Sandbox Code Playgroud)

我快速而肮脏的方法分为五个步骤:

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

复制大量数据效率非常低.我可以使用一些神秘的技巧来避免复制数据doublestruct后面吗?我想以某种方式解释一个1D数组double(大小是3的倍数)作为具有3个double成员的结构的一维数组.

bol*_*lov 3

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

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

键入 pune 时常用的一种技巧是使用union. 它是合法的C,但在 C++ 中是非法的,但某些编译器允许这样做。但就你的情况而言,我认为没有办法使用 union。

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