Как выровнять в памяти полезную нагрузку массива ByteArray # с помощью GHC Haskell

У меня есть несколько вопросов о том, как выровнять не полезную нагрузку массива ByteArray#, но ByteArray# (фактические байты данных неметаллада, хранящихся в массиве), что может быть осложнено тем фактом, что хранилища RTS массив метаданных в памяти прямо перед полезной нагрузкой массива:

Если у вас есть значение типа ByteArray#, оно определенно указывает на объект кучи с типом ARR_WORDS (см. ниже) ... ⋮ ARR_WORDS , MUT_ARR_PTRS_CLEAN, MUT_ARR_PTRS_DIRTY, MUT_ARR_PTRS_FROZEN0, MUT_ARR_PTRS_FROZEN Матрицы без указателей являются простыми: | Header | Bytes | Array payload | Усиливает ли newAlignedPinnedByteArray# это, специально выравнивая полезную нагрузку массива, а не выравнивая все, включая метаданные? Предполагая, что это не так, количество байтов, которые занимают метаданные, возможно, изменится с новыми версиями GHC. Как я могу определить, сколько байтов используется в компиляторе моего модуля (я с удовольствием использую Template Haskell или какой-то трюк Cabal)? Как я могу использовать эту информацию, чтобы выяснить, насколько больше я должен сделать массив для размещения дополнения, чтобы получить выравнивание полезной нагрузки массива? Как я могу использовать эту информацию, чтобы получить Addr# в новом начале полезной нагрузки массива?

Пожалуйста, убедитесь, что ваши предложения по правильному выравниванию не могут быть отменены, даже если копировальный сборщик мусора не заботится о выравнивании.

3
задан 13 August 2018 в 15:56

0 ответов

Другие вопросы по тегам:

Похожие вопросы: