在定义可存储实例时如何找到对齐值

Tim*_*ews 8 haskell ffi alignment

如果我可以在头文件中访问C结构定义但想要手动定义我的可存储实例而不使用像hsc2hs这样的东西,我如何找到对齐值?

错误的对齐值是否会导致崩溃或仅影响性能?

Joh*_*n L 8

编辑:抱歉,我误解了这个问题,并且认为你在问hsc2hs,而不是没有.不正确的对齐可能导致错误的数据并导致崩溃(考虑你是否正在编组结构数组),所以你真的应该使用便携式的东西.

根据FFI食谱,您可以定义

#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)
Run Code Online (Sandbox Code Playgroud)

然后用作

instance Storable Struct where
  alignment _ = #{alignment my_struct}
  sizeOf _ = #{size my_struct}
Run Code Online (Sandbox Code Playgroud)

alignment关键字应该在ghc> 7.2.1中可用,因此您不需要使用非常新的ghc来自己定义它.


Dan*_*her 5

__alignof__ (type) 使用 gcc,您可以找到每个more的对齐方式。然而,该值取决于体系结构,因此为了可移植性,您应该通过宏来确定每台计算机上的对齐方式。这意味着 hsc2hs 可能是更好的方法。

我认为错误的对齐可能会导致崩溃,但我不确定。