如何从Haskell分配和重用C结构?

时间:2012-06-08 19:49:06

标签: c haskell ffi allegro hsc2hs

特别是,我试图通过编写绑定到Allegro游戏库来学习Haskell的外部函数接口。在Allegro的原生C中,主事件循环看起来像这样:

// initialize event struct
ALLEGRO_EVENT event;

// main loop
while (running) {
    if (al_get_next_event(event_queue, &event)) {
        // process event here ...
    }
}

使用ghc和hsc2hs,我可以编写一个外部函数调用,如:

foreign import ccall "allegro5/allegro.h al_get_next_event"
    alGetNextEvent :: EventQueue -> Ptr (Event) -> IO (CInt)

其中EventQueue是指向不透明结构的指针,Event是基于C Storable的{​​{1}}实例。

理想情况下,对于面向用户的Haskell函数,我希望有类似

的类型签名
ALLEGRO_EVENT

将抽象出初始化getNextEvent :: EventQueue -> Maybe Event 结构和布尔返回值。

我的问题是,如何编写此函数以最大化内存效率?我可以在方法中malloc一个新的指针ALLEGRO_EVENT并使用它,但由于我正在使用基于C的数据,我想确保我重新使用现有空间而不是不断地分配新结构。我还想避免让用户malloc结构化并将其传递给每个调用。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

通常,如果它是本地范围的数据,则使用

如果数据范围较长,

是一个不错的选择,因为它非常快,你可以附加终结器,而且你不需要自己清理。

GHC运行时负责为您最大限度地重复使用空间,因此不需要太多担心效率,例如:将可变内存缓冲区固定到位。让GC来处理事情。