В последнее время записи в блоге, такие как "Вычисление размера хэш-карты" , объясняют, как рассуждать о пространственных сложностях обычно используемых типов контейнеров. Теперь я столкнулся с вопросом, как на самом деле "видеть", какую макет памяти выбирает моя версия GHC (в зависимости от флагов компиляции и целевой архитектуры) для странных типов данных (конструкторов), таких как
data BitVec257 = BitVec257 {-# UNPACK #-} !Word64
{-# UNPACK #-} !Word64
{-# UNPACK #-} !Bool
{-# UNPACK #-} !Word64
{-# UNPACK #-} !Word64
data BitVec514 = BitVec514 {-# UNPACK #-} !BitVec257
{-# UNPACK #-} !BitVec257
В C есть оператор sizeof
и offsetof
, который позволяет мне "видеть", какой размер и выравнивание были выбраны для полей C struct
.
Я пытался посмотреть на GHC Core в надежде найти какой-то намек, но я не знал, что искать. Может ли кто-нибудь указать мне в правильном направлении?