我一直在阅读有关Haskell的C FFI的一些文档.我刚刚遇到一个叫做的类型类Storable
,我不太了解它.
是这个类型类的实例,这些类型在与C代码接口时应该有一个"指针"吗?
还什么做的各个功能sizeOf
,alignment
,peek
,poke
怎么办?这似乎peek
与poke
使用内存指向从文件读取数据或写入数据到一个地方Ptr a
.这是正确的吗?
但我不知道是什么sizeOf
,并alignment
在所有的意思.有人可举例说明其用途吗?
red*_*neb 10
Haskell以与C非常不兼容的方式将值存储在内存中.因此,无法从haskell调用C函数并直接传递给它haskell值.相反,您必须创建值的副本,但不是精确副本,而是以C所理解的格式创建.这就是做什么Storable
.因此它实质上提供了将haskell值序列化为C友好格式的方法(例如,想想C结构).它还支持相反的操作,它可以反序列化值.当从haskell调用C函数并返回复杂(即非原始)值时,这很有用.
序列化/反序列化发生的帮助下poke
/ peek
.sizeOf
返回值的C表示的字节大小.请注意,此机制仅适用于具有固定大小的C表示的值(例如,结构).它不支持像C字符串这样的东西,它们的处理方式不同.至于alignment
,它用于确保在haskell土地上完成的内存分配满足平台的对齐要求.