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#memmovememcopy 的包装器,具体取决于数组是否重叠。

我 grep 了 the source of Data.Array,没有找到对 copyMutableArray 的引用。另一种可能性是 Data.Array 公开了一些方法,让您将 STUArray 视为 MutableArray,从而自己调用 copyMutableArray。但是我在 Data.Array.

中也没有提到 MutableArray

我的初步结论是 Data.Array.

中没有 memmove/memcopy 包装器