我看不到 Repa 在其任何“清单表示”中为数据指定内存布局。这是在某处指定的吗?
当然我可以通过实验来了解,但我更想知道布局是官方的还是随时可能改变的。
编辑:澄清一下,我了解 aStorable
Vector
的布局方式,但我想知道Array U DIM2 Double
(例如)是行优先、列优先还是某些疯狂的东西。
我看不到 Repa 在其任何“清单表示”中为数据指定内存布局。这是在某处指定的吗?
当然我可以通过实验来了解,但我更想知道布局是官方的还是随时可能改变的。
编辑:澄清一下,我了解 aStorable
Vector
的布局方式,但我想知道Array U DIM2 Double
(例如)是行优先、列优先还是某些疯狂的东西。
数据的内存布局由未装箱向量的类型类实例定义:
该实现使用基于类型族的@Data.Vector.Unboxed@,并为每种元素类型选择一种有效的、专门的表示。特别地,成对的未装箱向量被表示为成对的未装箱向量。
要查看向量的布局规范,请检查向量包中定义的未装箱向量的实例,其中例如 Bool 用字节表示:
newtype instance MVector s Bool = MV_Bool (P.MVector s Word8)
而如果我们深入研究原始数组包,您会看到原始类型的对齐和大小约束。根据 Repa 1,清单(分配)数组填充在row major中。最新版本的文档也支持这一点。
我还必须对数据做一些 FFI,所以要直接布局
由于您必须与 C 代码(或其他代码)进行互操作,因此使用Storable实例至关重要。这些将保证您的类型可以轻松地转移到 C 中(使用 C 布局约定,通过ForeignPtr 接口到 Repa,这确保您安全地将指向 C 形外部数据的指针映射到 Repa 和从 Repa。