[英]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.