Я пытаюсь выяснить, можно ли положить MutableArray#
в
компактная область. Это явно не рекомендуется ghc devs
и документация
потому что он позволяет пользователям указывать на что-то вне Compact
.
В стороне, я все еще заинтересован в попытке сделать это, с пониманием
что я буду нести ответственность за то, чтобы массив указывал только на вещи
внутри того же Compact
.
Мое мышление заключалось в том, чтобы добавить Array#
в компактную область, а затем
попытайтесь оттереть его, используя unsafeThawArray#
:
unsafeThawArray# :: Array# a -> State# s -> (#State# s, MutableArray# s a#)
Затем я мог бы использовать writeArray#
, если (а) все, что я
запись в MutableArray#
находится в одной и той же компактной области и (b) I
перед тем, как записать его в массив, оцените все в WHNF с помощью seq
. Я думаю, это было бы безопасно. У меня есть одна проблема, основанная на
stg_unsafeThawArrayzh комментарий:
MUT_ARR_PTRS живет в изменяемом списке, но MUT_ARR_PTRS_FROZEN обычно не...
Я не очень хорошо понимаю внутренности GHC, но вот мое понимание комментария:
Есть что-то, называемое изменчивым списком, в котором есть куча изменчивых массивов и
время от времени сканируется GC. Для моих целей это проблематично, поскольку это означает
что unsafeThawArray#
приведет к тому, что GC начнет сканирование вещей в компактном регионе.
Это нехорошо. Но, может быть, мое понимание ошибочно, и это было бы здорово.
Если unsafeThawArray#
не может делать то, что мне нужно, я думал, что unsafeCoerce#
будет
сделайте это, но я снова хотел бы услышать от кого-то, знающего эту тему. Спасибо и дайте мне знать, если я могу что-то прояснить.
EDIT: просто комментарий для будущих читателей. Подумав об этом больше, я понял, что лучше использовать SmallArray#
вместо Array#
. Это должно делать записи быстрее. Сравните код запись в MutableArray # с кодом для запись в SmallMutableArray #. Карточный стол, который MutableArray#
сохраняет обновленным, бесполезен, когда все находится на компактной куче, так как он никогда не будет отсканирован.