【发布时间】:2016-08-17 06:03:34
【问题描述】:
假设我有一个带有 很多 个构造函数的数据类型。
data ManyValues
= Value0
| Value1
| Value2
...
| Value255
| Value256
deriving (Show,Eq)
此数据类型的任何一个值的内存占用量是多少?我最初的理解是每个构造函数都是内存中的一个 8 位字,但是如果数据类型中的构造函数多于 8 位中可能的值怎么办。构造函数是否会增加到 16 位等等,直到它可以处理数据类型中存在的所有构造函数?还是我把这一切都搞混了?
【问题讨论】:
-
谢谢,我在发帖前看到了。当涉及到零字段构造函数时,它提出了关于对象共享的有趣观点,但它没有解决当构造函数(甚至是零字段构造函数)超过 8 位可寻址时会发生什么。这是假设这就是 8 位标头的用途。
-
啊,但是在那个答案中,标题“单词”肯定至少是 32 位。当然,原则上问题仍然存在(例如,一种方法可能是使用前 32 位来缩小选择范围),但如果您的数据类型有 2^32 个构造函数,您可能会面临其他工程困难。
-
各种
ManyValues之间的区别在编译过程中被抹去;只要需要对代码进行类型检查,您就只需要这些信息。在运行时,每个值只是一个单词,基本上表明该值存在。 -
看起来我的问题是由于对“单词”是什么感到困惑而提出的。在这里,我在考虑 8 位字并想知道“它将如何处理所有这些内存位置?”。但是,是的,在 32 位和 64 位机器上,“单词”将是 32 位和 64 位,上面链接的 SO 问题中也提到了这一点。因此,只有当我也像 pigworker 所说的那样触及虚拟内存的基本限制时,我的担忧才会成为一个合法的担忧。在发布这个问题之前,我应该睡个好觉。 :)
标签: haskell