一个c++垃圾收集器的解析(一)

       相关引用:云风blog.codingnow.com/2010/02/cpp_gc.html

      最近学习垃圾收集器(gc)的相关知识,可功力不足,自身实现有难度。加上复习一下c++的知识,这里就解读一下大牛的实现,高手直接无视之。
      首先看作者的版权说明,单独列出来就不在每个文件中一一包含了:
Code:
  1. /* 
  2.  *  Copyright (c) 2010 , 
  3.  *      Cloud Wu . All rights reserved. 
  4.  * 
  5.  *      http://www.codingnow.com 
  6.  * 
  7.  *  Use, modification and distribution are subject to the "New BSD License" 
  8.  *  as listed at <url: http://www.opensource.org/licenses/bsd-license.php >. 
  9.  */  
     此垃圾收集器采用标记清除算法。首先看i_gcobject代码:
Code:
  1. #ifndef interfacce_gcobject_h  
  2. #define interfacce_gcobject_h  
  3.   
  4. #define interface struct  
  5.   
  6. interface i_gcobject {  
  7.     virtual ~i_gcobject() {}  
  8.     virtual void touch() {}  
  9.     virtual void mark() = 0 ;  
  10.     virtual void grab() = 0 ;  
  11.     virtual void release() = 0 ;  
  12.   
  13.     static void collect();  
  14. };  
  15.   
  16. #endif  
      根据云风兄的描述,所有支持 gc 管理的接口都继承至  i_gcobject  ,提供三个方法:
      1、mark 可以把这个对象打上标记,被标记的对象将不会被 collect 回收。
      2、grab 将对象挂接到一个被称呼为 root 的特殊 gcobject 上。
      3、release 将对象从 root 上取掉。
    
      另提供 touch 的模板方法供 mark 回调,用来标记同一对象中的不同部分。
      mark 方法一般在 touch 方法中使用,另外,collect 方法将主动调用 root 的 mark 。
 
      知道了大概方法,不过还看不出什么名堂来,继续看 gcobject 的接口:
Code:
  1. #ifndef gc_object_h  
  2. #define gc_object_h  
  3.   
  4. #include "i_gcobject.h"  
  5.   
  6. class gcobject : virtual i_gcobject {  
  7.     bool marked;  
  8. public:  
  9.     gcobject();  
  10.     virtual void mark();  
  11.     virtual void grab();  
  12.     virtual void release();  
  13.     struct f_unmarked;  
  14. };  
  15.   
  16. #endif  
       这里我们大概知道了gcobject类会实现mark、grab、release方法,并提供了一个初始化的构造函数。marked变量是作为是否被标记的一个flag吧。struct f_unmarked暂时还不知道是干嘛的。另外这里可以看出gcobject虚继承自i_gcobject。我们知道虚继承通常与多重继承相关,因为虚继承的一个重要目的是共享其虚基类的状态,并且只共享其单个实例。比如我们常用的c++ i/o库:
           ios
        /       /
      /           /
ostream    istream
      /          /
       /       /
     iostream
       (简化后)
      这里的ostream、istream则虚继承于ios。休息一下,看gcobject的实现。

你可能感兴趣的:(一个c++垃圾收集器的解析(一))