Как найти значение выравнивания при определении хранимого экземпляра

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

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


person Tim Matthews    schedule 02.12.2011    source источник


Ответы (2)


Изменить: извините, я неправильно понял вопрос и подумал, что вы спрашиваете об этом с 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.

person John L    schedule 02.12.2011

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

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

person Daniel Fischer    schedule 02.12.2011