特别是,我试图通过编写绑定到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结构化并将其传递给每个调用。
有什么建议吗?
答案 0 :(得分:3)
通常,如果它是本地范围的数据,则使用
如果数据范围较长,
是一个不错的选择,因为它非常快,你可以附加终结器,而且你不需要自己清理。
GHC运行时负责为您最大限度地重复使用空间,因此不需要太多担心效率,例如:将可变内存缓冲区固定到位。让GC来处理事情。