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