出于性能原因,我希望将ByteString(严格的,现在的)零拷贝演绎到a Vector.由于Vector只是ByteArray#在引擎盖下,并ByteString是ForeignPtr这可能看起来是这样的:
caseBStoVector :: ByteString -> Vector a
caseBStoVector (BS fptr off len) =
withForeignPtr fptr $ \ptr -> do
let ptr' = plusPtr ptr off
p = alignPtr ptr' (alignment (undefined :: a))
barr = ptrToByteArray# p len -- I want this function, or something similar
barr' = ByteArray barr
alignI = minusPtr p ptr
size = (len-alignI) `div` sizeOf (undefined :: a)
return (Vector 0 size barr') …Run Code Online (Sandbox Code Playgroud)