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)

ここEventQueueで、は不透明な構造へのポインタであり、EventStorableCに基づくインスタンスですALLEGRO_EVENT

理想的には、ユーザー向けのHaskell関数については、次のような型署名が必要です。

getNextEvent :: EventQueue -> Maybe Event

ALLEGRO_EVENTこれは、構造体とブール値の戻り値の初期化を抽象化します。

私の質問は、メモリ効率を最大化するためにこの関数をどのように書くべきかということです。メソッド内への新しいポインターをmallocしてEvent使用することもできますが、Cベースのデータを使用しているため、既存のスペースを再利用し、常に新しい構造体を割り当てないようにします。また、ユーザーが構造体をmallocして、すべての呼び出しに渡すことを避けたいと思います。

何かアドバイス?

4

1 に答える 1

3

通常、ローカルスコープのデータの場合は、

データのスコープが長い場合は、

非常に高速で、ファイナライザーをアタッチでき、自分でクリーンアップする必要がないため、これは良い選択です。

GHCランタイムは、スペースを最大限に再利用するように処理するため、可変メモリバッファーを所定の位置に固定するなどして、効率について心配する必要はあまりありません。GCに任せてください。

于 2012-06-08T19:54:23.373 に答える