簡體   English   中英

如何建立垃圾收集器?

[英]How to build a Garbage Collector?

我正在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中。 現在說我對這個對象執行一些矩形數學運算,再創建兩個對象。

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

如您所見, halfWidth返回的Rect尚未使用,可以進行垃圾回收。

halfHeight創建的最終rect存儲在var quarterRect ,稍后我需要。

如何檢測未使用的對象並進行相應處理? 我一直在閱讀“ 引用計數”,“智能指針和C ++GC ,但是我仍然不知道如何檢測何時未使用引用以減少引用計數。 遞增引用計數很簡單:當您設置的其它變種指向這個對象,即: a = stageRect ,應增加的引用計數stageRect ,但是你怎么知道什么時候a是未使用的? 減少參考計數? 通常,您不需要在現代代碼中設置a = null 您只希望平台檢測到未使用的引用並進行處理。

好吧,讓我們考慮下面的代碼:

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我無法相信腳本語言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM