GHC Int类型的位大小

时间:2011-10-16 19:19:08

标签: haskell types size ghc

为什么GHC的Int type不能保证使用正好32位的精度? This document claim 至少 30位有符号精度。它是否以某种方式与将Maybe Int或类似物拟合为32位相关?

3 个答案:

答案 0 :(得分:24)

允许使用标记的Haskell实现。使用标记时,您需要一些位作为标记(至少有一个,两个更好)。我不确定目前是否有任何此类实现,但我似乎记得Yale Haskell使用它。

标记可以在一定程度上避免拳击的缺点,因为你不再需要装箱;相反,标签位会告诉你它是否被评估等。

答案 1 :(得分:14)

Haskell语言定义指出type Int covers at least the range [−229, 229−1]。 还有其他编译器/解释器使用此属性来增加生成的程序的执行时间。

对(对齐的)Haskell数据的所有内部引用都指向32位(64位)系统上4(8)的倍数的内存地址。因此,引用只需要30位(61位),因此允许2(3)位用于“指针标记”

在数据的情况下,GHC使用这些标签来存储有关该引用数据的信息,即该值是否已经被评估,如果是,那么它具有哪个构造函数。

如果是30位Int s(因此,不是GHC),您可以使用一位来判断它是指向未评估的Int还是Int的指针本身。

指针标记可用于一位引用计数,这可以加快垃圾收集过程。在运行时创建直接的一对一生产者 - 消费者关系的情况下,这可能很有用:它将直接导致内存重用,而不是垃圾收集器。

因此,使用2位指针标记,可能会有一些强烈优化的疯狂组合...... 在Ints的情况下,我可以想象这4个标签:

  • 对未评估的Int
  • 的单一引用
  • 对同一个可能仍未评估的Int
  • 的许多引用中的一个
  • Int本身
  • 的30位
  • 对已评估的32位Int的引用(可能有很多引用)。

答案 2 :(得分:5)

我认为这是因为早期的方法来实现GC和所有这些。如果你有32位可用且只需要30位,你可以使用这两个备用位来实现有趣的事情,例如使用最低有效位中的零来表示一个值而一个指针用于指针。

今天实现不使用那些位,因此Int在GHC上至少有32位。 (这不完全正确.IIRC可以设置一些标志为30或31位Int s)