0

私は Flash で作業しており、Flash Player で利用可能な新しい「ドメイン メモリ」を使用しようとしています。これにより、基本的に低レベルでメモリを操作できますが、ガベージ コレクタが組み込まれていない C++ と同様に、自分でメモリを管理する必要があります。基本的なアロケーター/デアロケーターを作成しましたが、未使用のオブジェクトの割り当てを解除できるように、ガベージ コレクターまたは参照カウンターを作成する方法が必要です。次の例を見てください。

Rect stageRect = new Rect(0, 0, stage.width, stage.height);
  // syntax is for understanding only
  // actually would allocate memory using my handwritten allocator

新しいものを作成Rectし、クラス メンバー var に格納しました。ここで、このオブジェクトに対していくつかの四角形の計算を実行し、さらに 2 つのオブジェクトを作成するとします。

Rect quarterRect = stageRect.halfWidth().halfHeight();

ご覧のとおり、Rect返された byhalfWidthは未使用であり、ガベージ コレクションが可能です。

によって作成された最終的な rectは、後で必要になるhalfHeightvar に格納されます。quarterRect

このような未使用のオブジェクトを検出し、それに応じて処分するにはどうすればよいですか? Reference Counting、 Smart PointersGC for C++ について読んできましたが、参照が使用されていないことを検出して参照カウントを減らす方法がまだわかりません。ref カウントをインクリメントするのは簡単です。別の var をこのオブジェクトを指すように設定すると、つまり:a = stageRectは の参照カウントを増やす必要がありますが、が未使用のstageRect場合はどうすればわかりますか? a参照カウントを減らすには?a = null通常、最新のコードで設定を回避することはありません。プラットフォームが未使用の参照を検出して破棄することを期待するだけです。

4

1 に答える 1

1

さて、このコードを考えてみましょう:

int someFunction() { // I have no clue about AS3 syntax, but I suppose it's C-like, right?
    Rect a = new Rect(...); // there are no pointers, only references, right?

    // ... some other stuff
} // <- what happens here?

閉じ中かっこで何が起こりますか? a変数がスコープ外になります。C++ では、変数がスコープ外になると、そのデストラクタが呼び出されます。変数がスコープから外れた場合、AS3 ではどうなりますか? ここで何も起こらなければ、プログラムで追跡できるものは何もありません...まあ、参照カウントを実装することは不可能だと思います。参照カウントの場合、値への参照がなくなったことを伝える方法が必要です。

しかし、AS3 には本当に GC がないのでしょうか? GC のないスクリプト言語など信じられません。

于 2013-01-16T06:46:13.280 に答える