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