Haskell 已装箱和未装箱整数的内存布局?

Haskell 已装箱和未装箱整数的内存布局?,haskell,ghc,Haskell,Ghc,我的理解是,Int值是指向thunk(双间接寻址)的指针,而unbox Int#只是指向32/64位Int的指针。对吗?指针如何编码它引用的是一个非固定值这一事实 声明Int是“至少具有范围[-2^29..2^29-1]的固定精度整数类型”。GHC中是否有一些优化,这些额外的位用于消除间接性?有一些很好的信息。但基本上,你说的Int值是指向thunk的指针是正确的。但是,未绑定值不是指向未绑定值的指针,而是未绑定值本身。此外,Haskell标准报告仅给出了Int范围的下限。IIRC、GHCInt

我的理解是,Int值是指向thunk(双间接寻址)的指针,而unbox Int#只是指向32/64位Int的指针。对吗?指针如何编码它引用的是一个非固定值这一事实

声明Int是“至少具有范围[-2^29..2^29-1]的固定精度整数类型”。GHC中是否有一些优化,这些额外的位用于消除间接性?

有一些很好的信息。但基本上,你说的
Int
值是指向thunk的指针是正确的。但是,未绑定值不是指向未绑定值的指针,而是未绑定值本身。此外,Haskell标准报告仅给出了
Int
范围的下限。IIRC、GHC
Int
的位超过30位


我不认为GHC使用未绑定类型的额外位来存储任何元数据,但它确实使用了指针位来存储元数据。有关详细信息,请参见第页。

正确。在GHC中,Int趋向于32位(例如:在x86系统上)或64位(例如:在x86_64上)。如果29位、32位和64位整数之间的差异很重要,那么用户应该利用
Int32
Int64
,或者整数。信息在类型(和种类)中——在GHC中,未固定的整数具有类型
Int#
,并且是二等公民(例如,您不能直接将其传递给多态函数,因为多态函数需要一个装箱的值)!Int--这也将作为
Foo
值的一部分直接存储在未装箱状态。但GHC将在必要时透明地对其进行装箱和取消装箱,因此您通常不必担心这一点。(编译时会再次知道该信息。)就其本身而言,它根本不需要存储;编译后的代码已经知道什么是装箱的,什么是未装箱的。@Danielkov在GHC中,未装箱的整数是二级公民,不能将它们传递给多态函数。(您可以向它们传递指针,然后将它们是不可遍历的整数的信息存储在定点块的标头中)。特别是,它们只能在编译器静态地知道它们存在的地方流动,并为它们生成正确的GC处理代码。OCaml整数可以传递给多态函数,因此多态函数无法静态地知道其参数值是整数还是指针,它需要一个标记。@DonStewart答案只是说Int#需要一个字的存储,并没有明确说明这个字本身就是整数,其他什么都没有,这是OP需要知道的。