Недавно появились записи в блогах, такие как Расчет размера хэш-карты объяснил, как рассуждать о космических сложностях часто используемых типов контейнеров. Теперь я столкнулся с вопросом, как на самом деле «увидеть», какую схему памяти выбирает моя версия 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 в надежде найти там подсказку, но не знал, что искать. Может ли кто-нибудь указать мне правильное направление?