STUArray 有 memmove/memcpy 包装器吗?
Is there a memmove/memcpy wrapper for STUArray?
我正在将一个程序从使用 MVector Word32
切换到 STUArray Word Word32
。在我的矢量代码中,我使用 unsafeMove
来移动矢量切片;认为它可能包装 memmove
以提高效率。
case dst ⊕ 3 of
src | n < src + w -> do
let w0 = n - src
let w' = w - w0
unsafeMove (slice dst w0 v) (slice src w0 v)
if w' <= 3
then do
unsafeMove (slice (n - 3) w' v) (slice 0 w' v)
else do
let w'' = w' - 3
unsafeMove (slice (n - 3) 3 v) (slice 0 3 v)
unsafeMove (slice 0 w'' v) (slice 3 w'' v)
src | n < dst + w -> do
let w1 = n - dst
let w'' = w - w1
unsafeMove (slice dst w1 v) (slice src w1 v)
unsafeMove (slice 0 w'' v) (slice 3 w'' v)
src -> do
unsafeMove (slice dst w v) (slice src w v)
MArray
类型类似乎没有提供在单个调用中移动多个元素的方法,只能一个接一个地移动。是否有用于一次移动多个 STUArray
元素(或可能 ByteArray#
)的包装器?
thinking it was probably wrapping memmove for efficiency
首先,我决定为您核实一下这是否属实,事实确实如此。
unsafeMove
最终归结为为 MVector
定义的 basicUnsafeCopy
操作,它委托给 copyMutableArray
.
copyMutableArray
's implementation 因 GHC 版本而异。对于旧版本,它只是一个普通的 IO 循环 Haskell,但从 7.8 开始它已经委托给一个 primop copyMutableArray#
。
copyMutableArray#
是 memmove
和 memcopy
的包装器,具体取决于数组是否重叠。
我 grep 了 the source of Data.Array,没有找到对 copyMutableArray
的引用。另一种可能性是 Data.Array 公开了一些方法,让您将 STUArray 视为 MutableArray,从而自己调用 copyMutableArray
。但是我在 Data.Array.
中也没有提到 MutableArray
我的初步结论是 Data.Array.
中没有 memmove
/memcopy
包装器
我正在将一个程序从使用 MVector Word32
切换到 STUArray Word Word32
。在我的矢量代码中,我使用 unsafeMove
来移动矢量切片;认为它可能包装 memmove
以提高效率。
case dst ⊕ 3 of
src | n < src + w -> do
let w0 = n - src
let w' = w - w0
unsafeMove (slice dst w0 v) (slice src w0 v)
if w' <= 3
then do
unsafeMove (slice (n - 3) w' v) (slice 0 w' v)
else do
let w'' = w' - 3
unsafeMove (slice (n - 3) 3 v) (slice 0 3 v)
unsafeMove (slice 0 w'' v) (slice 3 w'' v)
src | n < dst + w -> do
let w1 = n - dst
let w'' = w - w1
unsafeMove (slice dst w1 v) (slice src w1 v)
unsafeMove (slice 0 w'' v) (slice 3 w'' v)
src -> do
unsafeMove (slice dst w v) (slice src w v)
MArray
类型类似乎没有提供在单个调用中移动多个元素的方法,只能一个接一个地移动。是否有用于一次移动多个 STUArray
元素(或可能 ByteArray#
)的包装器?
thinking it was probably wrapping memmove for efficiency
首先,我决定为您核实一下这是否属实,事实确实如此。
unsafeMove
最终归结为为MVector
定义的basicUnsafeCopy
操作,它委托给copyMutableArray
.copyMutableArray
's implementation 因 GHC 版本而异。对于旧版本,它只是一个普通的 IO 循环 Haskell,但从 7.8 开始它已经委托给一个 primopcopyMutableArray#
。copyMutableArray#
是memmove
和memcopy
的包装器,具体取决于数组是否重叠。
我 grep 了 the source of Data.Array,没有找到对 copyMutableArray
的引用。另一种可能性是 Data.Array 公开了一些方法,让您将 STUArray 视为 MutableArray,从而自己调用 copyMutableArray
。但是我在 Data.Array.
我的初步结论是 Data.Array.
中没有memmove
/memcopy
包装器