Как найти значение выравнивания при определении хранимого экземпляра - PullRequest
8 голосов
/ 02 декабря 2011

Если у меня есть доступ к определению структуры C в заголовочных файлах, но я хочу определить свой сохраняемый экземпляр вручную, не используя что-то вроде hsc2hs, как мне найти значение выравнивания?

Также может быть неправильное значение выравниваниявызвать сбой или просто повлиять на производительность?

Ответы [ 2 ]

8 голосов
/ 02 декабря 2011

Редактировать: Извините, я неправильно прочитал вопрос и подумал, что вы спрашивали о том, чтобы сделать это с hsc2hs, а не без. Неправильное выравнивание может привести к неверным данным и вызвать сбои (подумайте, если вы распределяете массив структур), поэтому вам действительно следует использовать что-то переносимое.

Согласно поваренной книге FFI , вы можете определить

#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}

Ключевое слово alignment должно быть доступно в ghc> 7.2.1, поэтому вам не нужно определять его самостоятельно с очень новыми ghc.

4 голосов
/ 02 декабря 2011

С помощью gcc вы можете найти выравнивание для __alignof__ (type) more .Однако это значение зависит от архитектуры, поэтому для переносимости вы должны определить выравнивание на каждой машине с помощью макроса.Это означает, что hsc2hs, вероятно, лучше.

Я думаю, что неправильное выравнивание может привести к сбоям, но я точно не знаю.

...