Haskell 通过GHC'传递一种ByteArray类型意味着什么;什么是FFI?
在Haskell 2010报告中,从中,列出了外国金融机构进出口申报中支持的基本类型: 以下类型构成基本外来类型集:Haskell 通过GHC'传递一种ByteArray类型意味着什么;什么是FFI?,haskell,ghc,ffi,Haskell,Ghc,Ffi,在Haskell 2010报告中,从中,列出了外国金融机构进出口申报中支持的基本类型: 以下类型构成基本外来类型集: Haskell Prelude导出的Char、Int、Double、Float和Bool,以及 Int8,Int16,Int32,Int64,Word8,Word16,Word32,Word64,Ptr a,funtr a,以及stabletr a,适用于外国公司出口的任何类型a (第24节) 实施FFI的Haskell系统需要能够通过 这些类型在Haskell和外部上下文之
- Haskell Prelude导出的
、Char
、Int
、Double
和Float
,以及Bool
,Int8
,Int16
,Int32
,Int64
,Word8
,Word16
,Word32
,Word64
,Ptr a
,以及funtr a
,适用于外国公司出口的任何类型stabletr a
(第24节)a
Int
,Word
,Char
,Float
,
Double#
,Addr#
,StablePtr#a
,可变字节数组
,
ForeignObj
,以及ByteArray
当我指定ccall
调用约定时,这些类型中的大多数在链接器级别发生了什么,这一点非常清楚。例如,我非常确定Int
/Int#
作为两个32位值在堆栈上传递。类似地,Ptr a
/StablePtr a
/StablePtr#a
/Addr#
可能都作为堆栈上的指针传递
那么ByteArray
和MutableByteArray
呢?
我所能想象的就是将它们作为指针传递,但这似乎有点疯狂,因为除非您将
ByteArray
/MutableByteArray
固定,否则GHC运行时可能会将数组从您下方移走。此外,您还将忽略阵列上的大小信息。感谢@ThomasM.DuBuisson挖掘出一个:
有一种方法可以传递未固定的ByteArray
(或MutableByteArray
),
但前者在您的情况下似乎是正确的)使用
unlifedfitypes
语言扩展。ByteArray
保证
在通话期间不能移动。代码应该处理
ByteArray
参数就像是指向字节的指针一样。你需要
在C端进行任何地址偏移计算(即通过任何
作为C函数的额外参数所需的偏移量)
所以:这些都是作为指针传递的,GHC的运行时承诺不会将它们从您的下方移动