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