STUArray 是否有 memmove/memcpy 包装器?

ram*_*ion 1 arrays haskell memmove

我正在将程序从使用切换MVector Word32STUArray Word Word32. 在我的矢量代码中,我经常unsafeMove移动矢量切片;认为这可能是memmove为了提高效率而进行包装。

\n
case dst \xe2\x8a\x95 3 of\n  src | n < src + w -> do\n    let w0 = n - src\n    let w\' = w - w0\n    unsafeMove (slice dst w0 v) (slice src w0 v)\n    if w\' <= 3\n      then do\n        unsafeMove (slice (n - 3) w\' v) (slice 0 w\' v)\n      else do\n        let w\'\' = w\' - 3\n        unsafeMove (slice (n - 3) 3 v) (slice 0 3 v)\n        unsafeMove (slice 0 w\'\' v) (slice 3 w\'\' v)\n  src | n < dst + w -> do\n    let w1 = n - dst\n    let w\'\' = w - w1\n    unsafeMove (slice dst w1 v) (slice src w1 v)\n    unsafeMove (slice 0 w\'\' v) (slice 3 w\'\' v)\n  src -> do\n    unsafeMove (slice dst w v) (slice src w v)\n
Run Code Online (Sandbox Code Playgroud)\n

类型MArray类似乎没有公开一种在单次调用中移动多个元素的方法,而只是一个接一个地移动。是否有一个用于移动多个STUArray元素的包装器(或者也许ByteArray#一次

\n

ama*_*loy 5

认为它可能是为了提高效率而包装 memmove

首先,我决定向您核实这是否属实,事实确实如此。

  • unsafeMove最终归结为 basicUnsafeCopy为 定义的操作MVector,该操作委托给copyMutableArray
  • copyMutableArray的实现因 GHC 版本而异。对于旧版本,它只是普通 Haskell 中的 IO 循环,但从 7.8 开始,它已委托给 primop copyMutableArray#
  • copyMutableArray#memmove是和的包装器memcopy,具体取决于数组是否重叠。

我搜索了Data.Array 的源代码,没有发现对copyMutableArray. 另一种可能性是 Data.Array 公开了某种方式让您将 STUArray 视为 MutableArray,从而调用copyMutableArray自己。但我也发现 Data.Array 中没有提到 MutableArray。

我初步的结论是Data.Array中没有memmove/memcopy包装器。

  • 必须深入研究“Data.Array.Base”甚至“GHC.Arr”才能真正获得执行相当有效的数组操作所需的访问权限,这并不罕见。除非您确实需要灵活的索引,否则请使用“primitive”或“vector”中的数组。 (2认同)