我已经阅读了一些关于Haskell的C FFI的文档。我刚刚遇到了一个名为Storable的类型类,我不太理解它。
是这个类型类的实例吗?在与C代码接口时,这些类型应该有一个指向它们的“指针”?
另外,单独的函数sizeOf、alignment、peek、poke有什么作用?似乎peek和poke用于从Ptr a指向的内存中的某个位置读取数据或将数据写入内存中的某个位置。是这样的吗?
但是我根本不知道sizeOf和alignment是什么意思。有没有人能举例说明一下它们的用法?
发布于 2016-09-10 09:01:28
Haskell在内存中存储值的方式与C语言非常不兼容。因此,从haskell调用C函数并直接传递Haskell值是不可能的。相反,您必须创建值的副本,但不是完全相同的副本,而是以C语言能够理解的格式创建。这就是Storable所做的。因此,它本质上提供了将Haskell值序列化为C友好格式的方法(例如,考虑C结构)。它还支持相反的操作,它可以对值进行反序列化。当从haskell调用C函数并返回复杂(即非原始值)值时,这很有用。
序列化/反序列化是在poke/peek的帮助下进行的。sizeOf返回值的C表示形式的字节大小。请注意,这种机制只适用于具有固定大小的C表示的值(例如结构)。它不支持像C字符串这样的东西,它们被视为differently。至于alignment,它用于确保在Haskell域中完成的内存分配满足平台的对齐要求。
https://stackoverflow.com/questions/39421488
复制相似问题