Я пытаюсь выяснить, можно ли положить 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# сохраняет обновленным, бесполезен, когда все находится на компактной куче, так как он никогда не будет отсканирован.