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

时间:2011-12-02 01:31:39

标签: haskell alignment ffi

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

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

2 个答案:

答案 0 :(得分:8)

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

根据FFI cookbook,您可以定义

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

然后用作

instance Storable Struct where
  alignment _ = #{alignment my_struct}
  sizeOf _ = #{size my_struct}

ghc>中应该提供alignment关键字7.2.1,所以你不需要用非常新的ghc来自己定义它。

答案 1 :(得分:4)

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

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

相关问题