如果我可以在头文件中访问C结构定义,但想手动定义我的可存储实例而不使用像hsc2hs这样的东西,我该如何找到对齐值?
错误的对齐值是否会导致崩溃或仅影响性能?
答案 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可能是更好的方式。
我认为错误的对齐会导致崩溃,但我不确定。