为什么GHC的Int type
不能保证使用正好32位的精度? This document claim 至少 30位有符号精度。它是否以某种方式与将Maybe Int
或类似物拟合为32位相关?
答案 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
本身Int
的引用(可能有很多引用)。答案 2 :(得分:5)
我认为这是因为早期的方法来实现GC和所有这些。如果你有32位可用且只需要30位,你可以使用这两个备用位来实现有趣的事情,例如使用最低有效位中的零来表示一个值而一个指针用于指针。
今天实现不使用那些位,因此Int
在GHC上至少有32位。 (这不完全正确.IIRC可以设置一些标志为30或31位Int
s)