C++垃圾收集

C++垃圾收集

    由于公司项目的原因,开始学习.Net,上个月从china-pub买了本《.NET框架程序设计》来看,看到.NET提供的垃圾收集功能,感觉是个好东西,自己便琢磨着用C++实现一个垃圾收集器,于是又在网上找些资料来看。

http://www.contextfree.net/wangyg/b/tech_his/gc_history.html
这是王咏刚的垃圾收集趣史

http://www.hpl.hp.com/personal/Hans_Boehm/gc
这是H. J. Boehm 和 A. J. Demers 用 C 实现的保守垃圾收集算法。

    因为C/C++中可以随意使用指针,所以无法用库的形式实现一个完整的垃圾收集器。除非语言做出改变,这一点看起来目前是不可能的。
    但是如果遵守一些约定,可以在C++中倒是可以实现一定的垃圾收集功能。经过两次在公交车上的长考(住的离单位远,做车时间长:>)。想通了主要的问题。经过一天的编码实现了一个采用复制方法的垃圾收集器。但是使用时必须遵守一些约定。如下:
    1. 使用时主要用到两个类 GCObject 和 GCPointer,一看名字就知道它们分别是干什么的了。
    2. 需要拥有垃圾收集的类需派生自GCObject,GCObject必须new出来,不能使用局部或全局变量。new出来的GCObject不能使用原生指针引用,只能使用GCPointer引用。
    3. GCPointer只能出现在两个地方,一是函数中的局部变量,一是GCObject派生类的成员。不能用做全局变量。
    4. 在GCObject派生类成员函数中使用自身变量或函数时,不能用this指针,需要先将this赋值到一个GCPointer中,然后用此GCPointer访问成员变量或函数。

在此附上源代码。/Files/fdyjfd/gc.rar 有兴趣的朋友帮忙写个程序测试下。

  刚接触垃圾收集技术,对各种算法还不太了解(自己实现的这个到底算不算正宗的复制算法都没把握)等我买的《垃圾收集》一书(http://www.china-pub.com/computers/common/info.asp?id=18468)到手后,在研究下其他各种算法,逐个实现。

另:因为无法在语言一级实现,开销比较大,比引用计数的方法大,不过却没有引用计数方法中循环引用的问题。个人认为如果能在语言一级实现的话,开销将大大降低,特别是在即将到来的多核时代,如果C++能够在语言一级支持垃圾收集,定能提高其执行期效率,希望C++能做出改变。

原文地址:https://www.cnblogs.com/fdyjfd/p/625824.html