ram*_*ion 1 arrays haskell memmove
我正在将程序从使用切换MVector Word32为STUArray Word Word32. 在我的矢量代码中,我经常unsafeMove移动矢量切片;认为这可能是memmove为了提高效率而进行包装。
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)\nRun Code Online (Sandbox Code Playgroud)\n类型MArray类似乎没有公开一种在单次调用中移动多个元素的方法,而只是一个接一个地移动。是否有一个用于移动多个STUArray元素的包装器(或者也许ByteArray#一次
认为它可能是为了提高效率而包装 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包装器。
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |