看代碼吧。

















































看看上面的一段代碼,基本演示了怎么用這個垃圾回收器。
1. gc.malloc< >( ) 為對象分配空間,并調用構造函數。gc.malloc有多個參數的模板函數,構造函數的參數直接放里面就可以。
2. 能被垃圾回收器回收的對象,必須定義一個以Begin_Member_Pointer(TypeName) 開始,以End_Member_Pointer結束,中間包含所有pointer類型成員變量的列表(順序無關)。
3. 在任意時候調用gc.collect( )來回收所有無用內存,并會對所有被回收的對象調用析構函數。
4. 在回收后可以選擇調用gc.compress( )來緊縮內存。
當然現在如果有朋友讀過源碼,會發現和上面所有有些不一致,不過上面是最終的效果。
這里就對指針的使用有了一些限制,
1. 所有受垃圾回收器控制的內存的指針是以 pointer<type> 的形式存在,而且是強制的。pointer類型不能轉化成普通指針,而且gc.malloc函數返回的也是pointer類型的指針,這個是必須的,因為要實現內存緊縮,所有的指針必須受控)。
2. 所有的類型定義里面必須包含對成員指針的一個描述,見上面第2條。否則想上面在B的構造函數中申請出來的A對象就無法被釋放了。
這些對成員的描述就是上面圖中粉紅色圓圈的指針了,如果沒有這些定義,有些內存塊的可達性判斷就可能失效。
這里我做了一些簡化,暫時不考慮多核多線程,所以寄存器可以不考慮,這大幅降低了編碼的復雜度,使得代碼更容易理解。
先看看所有的數據結構吧:




























上面就是全部的數據結構,需要說明的是:
1。 那個marker是一個函數指針,它的第二個參數也是個函數指針。
2。 了解C++的朋友可能會說,析構函數不能對其取地址。當然這里用了一個小小的技巧---對析構函數進行了包裝。

























3。 注意gc_mark不是一個bool變量,它會隨著每次分配而++,在collect之前,會用++mark來標記所有可達內存塊,即node.mark = gc_mark; 于是,所有mark值和gc_mark不等的內存塊就需要被回收啦。
從下篇開始就逐個介紹各個函數了,最后再用宏或模板做出來一些語法糖,把見不得人的東西都包起來,就大功告成了。