gpt4 book ai didi

haskell - 将 GHC ByteArray# 复制到 Ptr

转载 作者:行者123 更新时间:2023-12-02 14:35:23 25 4
gpt4 key购买 nike

我正在尝试编写以下函数:

memcpyByteArrayToPtr :: 
ByteArray# -- ^ source
-> Int -- ^ start
-> Int -- ^ length
-> Ptr a -- ^ destination
-> IO ()

行为应该是内部使用 memcpy复制 ByteArray# 的内容到Ptr 。我见过两种技术可以完成这样的事情,但我很难推断它们的安全性。

第一个位于 memory 中包裹。有一个辅助功能withPtr定义为:

data Bytes = Bytes (MutableByteArray# RealWorld)

withPtr :: Bytes -> (Ptr p -> IO a) -> IO a
withPtr b@(Bytes mba) f = do
a <- f (Ptr (byteArrayContents# (unsafeCoerce# mba)))
touchBytes b
return a

但是,我很确定这只是安全的,因为这是构造 Bytes 的唯一方法。是通过使用调用 newAlignedPinnedByteArray# 的智能构造函数。 An answer given to a similar questiondocs for byteArrayContents# 表明仅在处理固定的 ByteArray# 时才是安全的s。在我的情况下,我正在处理 ByteArray#就是text图书馆uses internally ,而且它们没有被固定,所以我相信这是不安全的。

我偶然发现的第二种可能性是 text本身。底部Data.Text.Array source code ,有一个 ffi 函数memcpyI :

foreign import ccall unsafe "_hs_text_memcpy" memcpyI
:: MutableByteArray# s -> CSize -> ByteArray# -> CSize -> CSize -> IO ()

这是由以下 C 代码支持的:

void _hs_text_memcpy(void *dest, size_t doff, const void *src, size_t soff, size_t n)
{
memcpy(dest + (doff<<1), src + (soff<<1), n<<1);
}

因为它是 text 的一部分,我相信这是安全的。它看起来很危险,因为它正在从未固定的 ByteArray# 获取内存位置。 ,正是 byteArrayContents#文档警告反对。我怀疑这没关系,因为 ffi 调用被标记为不安全,我认为这会阻止 GC 移动 ByteArray#在 ffi 通话期间。

这就是我迄今为止所做的研究。到目前为止,我最好的猜测是我可以复制text中所做的事情。 。最大的区别在于,不是传入 MutableByteArray#ByteArray#作为两个指针,我将传递 ByteArray#Ptr a (或者可能是 Addr# ,我不确定您通常将哪一个与 ffi 一起使用)。

我的建议安全吗?有没有更好的方法可以让我避免使用 ffi? base里面有东西吗?是这样的吗?请随意纠正我所做的任何不正确的假设,并感谢您的任何建议或指导。

最佳答案

copyByteArrayToAddr# :: ByteArray# -> Int# -> Addr# -> Int# -> State# s -> State# s

看起来像是正确的原药。您只需要确保不要尝试将其复制到它占用的内存中即可。所以你应该可以安全地使用

copyByteArrayToPtr :: ByteArray# -> Int -> Ptr a -> Int -> ST s ()
copyByteArrayToPtr ba (I# x) (Ptr p) (I# y) = ST $ \ s ->
(# copyByteArrayToAddr# ba x p y s, () #)

不幸的是,文档没有告诉我每个 Int# 的含义,但我想你可以通过试验和段错误来弄清楚。

关于haskell - 将 GHC ByteArray# 复制到 Ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39691402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com