可存储的类型类在Haskell中做了什么

时间:2016-09-10 00:54:21

标签: haskell

我一直在阅读有关Haskell的C FFI的一些文档。我刚刚遇到了一个名为Storable的类型类,我不太了解它。

是这个类型类的实例,那些类型应该有一个"指针"他们在与C代码接口的同时?

此外,sizeOfalignmentpeekpoke的个人功能如何?似乎peekpoke用于从Ptr a指向的内存中读取数据或将数据写入内存中。这是正确的吗?

但我不知道sizeOfalignment的意思。有人可举例说明其用途吗?

1 个答案:

答案 0 :(得分:10)

Haskell以与C非常不兼容的方式将值存储在内存中。因此,无法从haskell调用C函数并直接传递给haskell值。相反,您必须创建值的副本,但不是精确副本,而是使用C理解的格式。Storable的作用是什么。因此,它基本上提供了将haskell值序列化为C友好格式的方法(例如,思考C结构)。它还支持相反的操作,它可以反序列化值。当从haskell调用C函数并返回复数(即非原始)值时,这很有用。

序列化/反序列化在poke / peek的帮助下进行。 sizeOf返回值的C表示的字节大小。请注意,此机制仅适用于具有固定大小的C表示的值(例如,结构)。它不支持像C字符串这样的东西,它们被视为differently。至于alignment,它用于确保在haskell土地上完成的内存分配满足平台的对齐要求。