盒装和非盒装整数的内存布局?

Dan*_*kov 8 haskell ghc

我的理解是Int值是指向thunk(双重间接)的指针,而未装箱的Int#只是指向32/64位int的指针.那是对的吗?指针如何编码它指的是未装箱的值?

所述的Haskell标准规定,一个Int是"A固定精度整数类型至少与所述范围[-2 ^ 29 .. 2 ^ 29-1]".在GHC中是否有一些优化,其中那些额外的位用于消除间接?

Tra*_*ies 13

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

我不认为GHC使用额外的未装箱类型来存储任何元数据,但它确实使用指针位来执行此操作.有关详细信息,请参阅页面.

  • 信息属于类型(和种类) - 未装箱的Int在GHC中具有类型`Int#`,并且是二等公民(例如,您不能直接将其传递给多态函数,因为多态函数需要盒装价值). (6认同)
  • 当你有一个解压缩的严格的Int - 就像在`data Foo = Foo { - #UNPACKED# - }!Int`中那样,它们也将被存储为未装箱的,直接作为`Foo`值的一部分.但GHC会在必要时透明地装箱和拆箱,因此您通常不必担心这一点.(并且在编译时再次知道这些信息.) (2认同)
  • 它根本不需要存储; 已编译的代码已经知道什么是盒装的,什么是未装箱的. (2认同)