2

参照カウント構造はどのように機能しますか? たとえば、SDL_Surface次を見てみましょう。

typedef struct SDL_Surface
{
    ...
    int refcount;
} SDL_Surface;

s = SDL_CreateRGBSurface(...); // <-- what happens here?
SDL_FreeSurface(s); // <-- and here?

自分のコードに参照カウントを実装するにはどうすればよいですか?

4

1 に答える 1

4

SDL_CreateRGBSurface(または適切な派生構造体)の新しいインスタンスを割り当て、SDL_Surface参照カウントをインクリメントします (1 に設定します)。

SDL_FreeSurface参照カウントをデクリメントし、それがゼロかどうかをチェックします。そうである場合、それは他のオブジェクトがサーフェスを使用していないことを意味し、割り当てが解除されます。

また、SDL は、オブジェクトが別の場所 (レンダラーなど) で使用されるたびに、refcount がインクリメントされることも保証します。したがって、SDL_FreeSurfaceが呼び出されたときに参照カウントが 0 以外の場合、他のオブジェクトがそれを使用している必要があります。その他のオブジェクトも、最終的にSDL_FreeSurfaceはサーフェスを呼び出して解放します。

参照カウントを使用すると、サイクル収集ガベージ コレクターのオーバーヘッドなしでオブジェクトを安価に追跡できます。ただし、1 つの欠点は、循環を処理できないことです (たとえば、オブジェクト A が B への参照を保持し、B への参照を保持する場合)。そのような場合、他のすべての外部参照がなくなった場合でも、サイクルは関係するオブジェクトを存続させます。

refcounting を実装するには、refcount したい任意のオブジェクトに refcount フィールドを追加し、オブジェクトのすべての割り当てと割り当て解除が適切な refcount-maintaining インターフェイス (あなたが定義する必要があります)。最後に、オブジェクトまたは関数が refcount されたオブジェクトへの参照を必要とする場合、最初に refcount をインクリメントして (直接または何らかのインターフェイスを介して) 参照を取得する必要があります。完了したら、refcount をデクリメントする必要があります。

于 2012-08-26T06:11:01.737 に答える