繁体   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