3

特别是,我正在尝试通过编写与 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)

whereEventQueue是指向不透明结构的指针,并且EventStorable基于 C 的实例ALLEGRO_EVENT

理想情况下,对于面向用户的 Haskell 函数,我希望有一个类型签名,例如

getNextEvent :: EventQueue -> Maybe Event

这将抽象出初始化ALLEGRO_EVENT结构和布尔返回值。

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

有什么建议吗?

4

1 回答 1

3

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

如果数据范围更长,

是个不错的选择,因为速度很快,可以附加finalizers,不用自己清理。

GHC 运行时会为您最大限度地重用空间,因此不必担心效率问题,例如将可变内存缓冲区固定到位。让 GC 来处理。

于 2012-06-08T19:54:23.373 回答