2013-06-28 4 views
8

Я понимаю, что значение Int является указателем на thunk (double intirection), а unboxed Int # - это просто указатель на 32/64 бит int. Это верно? Как указатель кодирует тот факт, что он ссылается на unboxed значение?Макет памяти в штучной упаковке и unboxed ints?

В заявлении Haskell standard указано, что Int является «целым числом с фиксированной точностью, по крайней мере с диапазоном [-2^29 .. 2^29-1]». Есть ли какая-то оптимизация в GHC, где эти дополнительные биты используются для устранения ограничений?

+1

http://stackoverflow.com/a/3256825/83805 и http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/HeapObjects –

+1

@DonStewart Этот ответ просто говорит, что Int # берет слово для хранения и не является _explicit_ о том, что слово - это всего лишь целое число, ничего больше, что нужно знать OP. – AndrewC

ответ

13

GHC documentation имеет хорошую информацию. Но в принципе, вы правильно говорите, что значение Int является указателем на thunk. Однако значение unboxed не является указателем на значение unboxed, оно - это самораспакованное значение. Кроме того, стандартный отчет Haskell дает только нижний предел диапазона Int. IIRC, GHC Int имеют более 30 бит.

Я не думаю, что GHC использует дополнительные биты unboxed типов для хранения любых метаданных, но для этого используется бит указателей. См. Страницу this для получения более подробной информации.

+0

Исправить. В GHC 'Int' имеет тенденцию быть 32 бита (например: на системах x86) или 64 бита (например: на x86_64). Если разница между 29, 32 и 64 бит Ints важна, тогда пользователи должны использовать 'Int32',' Int64' или, возможно, Integer. –

+0

Итак, как среда выполнения различает коробку и unboxed Int? Где находится информация о том, что значение является сырым int, хранящимся? –

+6

Информация относится к типу (и виду) - unboxed Int имеет тип 'Int #' в GHC и является гражданином второго сорта (например, вы не можете передать его в полиморфную функцию напрямую, поскольку полиморфная функция ожидает значение в штучной упаковке). – shachaf