私の理解では、Int 値はサンク (二重間接参照) へのポインターであり、ボックス化されていない Int# は 32/64 ビット int への単なるポインターです。あれは正しいですか?ポインターは、ボックス化されていない値を参照しているという事実をどのようにエンコードしますか?
Haskell 標準では、Int は「少なくとも範囲 [-2^29 .. 2^29-1] の固定精度整数型」であると規定されています。これらの余分なビットを使用して間接性を排除する GHC の最適化はありますか?
私の理解では、Int 値はサンク (二重間接参照) へのポインターであり、ボックス化されていない Int# は 32/64 ビット int への単なるポインターです。あれは正しいですか?ポインターは、ボックス化されていない値を参照しているという事実をどのようにエンコードしますか?
Haskell 標準では、Int は「少なくとも範囲 [-2^29 .. 2^29-1] の固定精度整数型」であると規定されています。これらの余分なビットを使用して間接性を排除する GHC の最適化はありますか?
The GHC documentation has some good information. But basically, you're correct in saying that an Int
value is a pointer to a thunk. However, an unboxed value is not a pointer to the unboxed value, it is the unboxed value itself. Also, the Haskell standard report merely gives the lower limit on the range of Int
. IIRC, GHC Int
's have more than 30-bits.
GHC がボックス化されていない型の余分なビットを使用してメタデータを格納するとは思いませんが、ポインターのビットを使用してそうしています。詳しくはこちらのページをご覧ください。