粗看了一下接口,很少很正交,使用例子也非常簡單。只是我對垃圾收集的原理不是很熟悉,又或者這些接口太接近gc的底層原理,因此我并不是很確定如何運用這些接口。
借用某句著名的話,“源碼面前,了無秘密”。為了了解如何運用這些接口,我決定去看看這個不到1000行的gc庫的源碼,順便寫些東西,畢竟好久沒寫了。
yfgc的地址
svn地址:http://manualgc.googlecode.com/svn/trunk
撇去weak table和再分配不談,yfgc有以下接口
1
void gc_init();
2
void gc_exit();
3
4
void gc_enter();
5
void gc_leave(void *p,
);
6
7
void* gc_malloc(size_t sz,void *parent,void (*finalizer)(void *));
8
9
void gc_link(void *parent,void *prev,void *now);
10
void gc_collect();

2

3

4

5


6

7

8

9

10

先看幾個明顯易懂的
gc_init,一看就知道是初始化這個gc庫的,約摸著底下也就是初始化一些數據結構,分配一些初始內存等等。不過至于做了什么,以后再談。
gc_exit,一看就知道是在程序退出時析構gc庫的,多半是釋放內存。如果實現不是很復雜的話,不調用這個函數也不會怎樣。
gc_collect,一定是收集垃圾的了,不過現在就深入這個函數的話,一定是本末倒置。因為還不知道內存在哪里分配,就去看內存收集顯然是不對的。
gc_malloc,可以肯定,這就是gc庫的內存分配接口了。好吧,先看看這個函數,我都有點迫不及待了。
先看一下gc_malloc的三個參數
1.sz,請求分配的內存大小
2.parent,按字面意思是父親,如果用工廠模式做類比的話,也許會更容易理解些。工廠生產一個對象,就申請一塊內存,parent則是工廠本身。
更通用和接近的解釋是,parent即持有或者用指針引用這塊新內存的那些對象。垃圾收集的概念就是,當一塊內存在程序里不被任何對象持有或者指針引用的時候,它就是一塊廢棄的內存,可以被系統回收。當有任何一個指針引用著這塊內存的時候,他就必然不能被回收。
所以,parent這個參數,或者說,新分配的內存必須要比parent那塊內存活得更長久,因為parent擁有或者引用著這塊新分配的內存。
3.finalizer,析構函數,如果分配內存用來實例化一個類的話,那么這塊內存要回收的時候,顯然要有一個時機來調用類的析構函數才行。這個回調函數正好可以完成這個任務。
干脆寫一個yfgc的源碼解析系列好了