如何在内存中对齐 ByteArray# 的数组负载与 GHC Haskell
How to align in memory the array payload of a ByteArray# with GHC Haskell
我有几个问题关于如何对齐不是 ByteArray#
而是 ByteArray#
的 数组负载 (存储的非元数据数据的实际字节数在数组中),这可能会因为 RTS 在内存中存储数组元数据 就在 数组有效负载之前
而变得复杂:
ARR_WORDS
, MUT_ARR_PTRS_CLEAN
, MUT_ARR_PTRS_DIRTY
, MUT_ARR_PTRS_FROZEN0
, MUT_ARR_PTRS_FROZEN
newAlignedPinnedByteArray#
是否已经通过专门对齐数组负载而不是对齐包括元数据在内的所有内容来解决这个问题?
- 假设它没有,元数据占用的字节数可能会随着新的 GHC 版本而改变。我如何确定在我的模块编译时占用了多少字节(我非常乐意使用模板 Haskell 或某种 Cabal 技巧)?
- 我如何使用该信息来确定我应该使数组大多少来容纳填充以使数组有效负载对齐?
- 我如何使用该信息获取
Addr#
到数组负载的填充开头?
请确保即使复制垃圾收集器不关心对齐,您关于获得正确对齐的建议也不会被撤消。
来自执行比对的PrimOps.cmm
中的GHC源代码:
/* Now we need to move p forward so that the payload is aligned
to <alignment> bytes. Note that we are assuming that
<alignment> is a power of 2, which is technically not guaranteed */
p = p + ((-p - SIZEOF_StgArrBytes) & (alignment - 1));
因此,对齐的是有效负载,而不是header。
我有几个问题关于如何对齐不是 ByteArray#
而是 ByteArray#
的 数组负载 (存储的非元数据数据的实际字节数在数组中),这可能会因为 RTS 在内存中存储数组元数据 就在 数组有效负载之前
ARR_WORDS
,MUT_ARR_PTRS_CLEAN
,MUT_ARR_PTRS_DIRTY
,MUT_ARR_PTRS_FROZEN0
,MUT_ARR_PTRS_FROZEN
newAlignedPinnedByteArray#
是否已经通过专门对齐数组负载而不是对齐包括元数据在内的所有内容来解决这个问题?- 假设它没有,元数据占用的字节数可能会随着新的 GHC 版本而改变。我如何确定在我的模块编译时占用了多少字节(我非常乐意使用模板 Haskell 或某种 Cabal 技巧)?
- 我如何使用该信息来确定我应该使数组大多少来容纳填充以使数组有效负载对齐?
- 我如何使用该信息获取
Addr#
到数组负载的填充开头?
请确保即使复制垃圾收集器不关心对齐,您关于获得正确对齐的建议也不会被撤消。
来自执行比对的PrimOps.cmm
中的GHC源代码:
/* Now we need to move p forward so that the payload is aligned
to <alignment> bytes. Note that we are assuming that
<alignment> is a power of 2, which is technically not guaranteed */
p = p + ((-p - SIZEOF_StgArrBytes) & (alignment - 1));
因此,对齐的是有效负载,而不是header。