大代数数据类型的记忆足迹

时间:2016-08-17 06:03:35

标签: haskell

假设我的数据类型包含 lot 的构造函数。

data ManyValues
  = Value0
  | Value1
  | Value2
  ...
  | Value255
  | Value256
  deriving (Show,Eq)

此数据类型的任何一个值的内存占用量是多少?我最初的理解是每个构造函数在内存中都是一个8位字,但是如果数据类型中的构造函数多于8位中的可能值,那该怎么办呢?构造函数是否会被提升到16位,依此类推,直到它可以解决数据类型中存在的所有构造函数?或者我是否将这一切混淆了?

1 个答案:

答案 0 :(得分:3)

据我所知,一个nullary构造函数需要1个机器存储字(即,它是指向静态分配数据的指针)。因此,无论您的数据结构是1个这样的构造函数还是1,000,000,它仍然是1个机器字。

具有字段的构造函数占用更多空间,但GHC特殊情况下的nullary构造函数在该值的所有实例之间共享单个静态单例。 (例如,整个计划中只有一个True。)

当然,当thunk评估已经存在的值(任何值)时,GHC会使用“重定向”节点覆盖thunk,这会占用一些空间。垃圾收集器会定期删除重定向。