青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 18,  comments - 104,  trackbacks - 0
上篇說到垃圾回收器的一些基本原理。這次說說這個(gè)垃圾回收器最終效果啥呀。有著明確的需求,說起來會(huì)更清晰,更明確。

看代碼吧。

struct A
{
    int i,j,k;

    Begin_Member_Pointer(A)
    End_Member_Pointer

    
};


struct B
{
    pointer<A> data0;

    B()
    {
        data0 = gc.malloc<A>();
    }

    Begin_Member_Pointer(B)
    Member(data0);
    End_Member_Pointer

};

pointer<B> test()
{
    pointer<B> pB = gc.malloc<B>();
    //做一些事情
    return pB;
}

void main()
{
    pointer<B> pB = test();
    //做一些事情
    gc.collect();
    gc.compress();

}

看看上面的一段代碼,基本演示了怎么用這個(gè)垃圾回收器。

1.  gc.malloc< >(  ) 為對(duì)象分配空間,并調(diào)用構(gòu)造函數(shù)。gc.malloc有多個(gè)參數(shù)的模板函數(shù),構(gòu)造函數(shù)的參數(shù)直接放里面就可以。
2.  能被垃圾回收器回收的對(duì)象,必須定義一個(gè)以Begin_Member_Pointer(TypeName) 開始,以End_Member_Pointer結(jié)束,中間包含所有pointer類型成員變量的列表(順序無關(guān))。
3.  在任意時(shí)候調(diào)用gc.collect(  )來回收所有無用內(nèi)存,并會(huì)對(duì)所有被回收的對(duì)象調(diào)用析構(gòu)函數(shù)。
4.  在回收后可以選擇調(diào)用gc.compress(  )來緊縮內(nèi)存。

當(dāng)然現(xiàn)在如果有朋友讀過源碼,會(huì)發(fā)現(xiàn)和上面所有有些不一致,不過上面是最終的效果。

這里就對(duì)指針的使用有了一些限制,

1. 所有受垃圾回收器控制的內(nèi)存的指針是以 pointer<type> 的形式存在,而且是強(qiáng)制的。pointer類型不能轉(zhuǎn)化成普通指針,而且gc.malloc函數(shù)返回的也是pointer類型的指針,這個(gè)是必須的,因?yàn)橐獙?shí)現(xiàn)內(nèi)存緊縮,所有的指針必須受控)。
2. 所有的類型定義里面必須包含對(duì)成員指針的一個(gè)描述,見上面第2條。否則想上面在B的構(gòu)造函數(shù)中申請(qǐng)出來的A對(duì)象就無法被釋放了。

這些對(duì)成員的描述就是上面圖中粉紅色圓圈的指針了,如果沒有這些定義,有些內(nèi)存塊的可達(dá)性判斷就可能失效。

這里我做了一些簡化,暫時(shí)不考慮多核多線程,所以寄存器可以不考慮,這大幅降低了編碼的復(fù)雜度,使得代碼更容易理解。

先看看所有的數(shù)據(jù)結(jié)構(gòu)吧:

//掃描成員指針的函數(shù)指針
typedef void (*marker) (const void* ptr, void(*func)(const pointer_base&));

//根集
std::list<pointer_base *> gc_root_set;

//內(nèi)存塊節(jié)點(diǎn)
struct node
{
    
void* mem;        //內(nèi)存指針(普通指針)
    unsigned int size;    //內(nèi)存大小
    unsigned int mark;    //當(dāng)前的標(biāo)志
    marker func;        //掃描函數(shù)指針
    destructor finalizer;    //析構(gòu)函數(shù)指針
}
;

//內(nèi)存塊集
std::map<const void *, node> gc_holder;
//標(biāo)志
unsigned int gc_marker = 0;
//標(biāo)志當(dāng)前指針是否屬于根集
bool gc_is_root_set_locked = false;
//所有指針集(用于緊縮)
std::multimap<const void*const pointer_base*> gc_pointer_set;
//緊縮時(shí)用的緩沖
std::map<const void*const void*> gc_swap_buffer;

上面就是全部的數(shù)據(jù)結(jié)構(gòu),需要說明的是:
1。 那個(gè)marker是一個(gè)函數(shù)指針,它的第二個(gè)參數(shù)也是個(gè)函數(shù)指針。
2。 了解C++的朋友可能會(huì)說,析構(gòu)函數(shù)不能對(duì)其取地址。當(dāng)然這里用了一個(gè)小小的技巧---對(duì)析構(gòu)函數(shù)進(jìn)行了包裝。

template <class _T>
void gc_destructor(_T* p)
{
    p
->_T::~_T();
}
;

typedef 
void (*destructor) (void*);

struct node
{
    
void* mem;
    unsigned 
int size;
    unsigned 
int mark;
    marker func;
    
//注意類型
    destructor finalizer;
}
;

node n;
//這是關(guān)鍵
n.finalizer = (destructor)&gc_destructor<_T>;

 

3。 注意gc_mark不是一個(gè)bool變量,它會(huì)隨著每次分配而++,在collect之前,會(huì)用++mark來標(biāo)記所有可達(dá)內(nèi)存塊,即node.mark = gc_mark; 于是,所有mark值和gc_mark不等的內(nèi)存塊就需要被回收啦。

從下篇開始就逐個(gè)介紹各個(gè)函數(shù)了,最后再用宏或模板做出來一些語法糖,把見不得人的東西都包起來,就大功告成了。

posted on 2010-02-10 19:09 尹東斐 閱讀(2640) 評(píng)論(10)  編輯 收藏 引用

FeedBack:
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-10 19:54 | jimmy
果然大牛啊!!  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-12 12:23 | Benjamin
如果能考慮一下異常,會(huì)完整些  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-13 12:00 | yindf
@Benjamin

完成了會(huì)考慮的,謝謝支持。  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-18 12:04 | 路過
失敗的垃圾設(shè)計(jì),買本《垃圾收集》來看看好不?  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-18 20:01 | yindf
@路過

呵呵~~你看過的話在C++下實(shí)現(xiàn)一個(gè)吧,我求你了。  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-18 21:53 | 路過
《Garbage Collection》Jones, Richard/ Lins, Rafael著,
強(qiáng)烈建議仔細(xì)讀讀這本書,去看看HP CPPGC源碼。概念不清,常識(shí)性錯(cuò)誤。
唉。。。  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-19 02:25 | yindf
@路過

HP gc看過啦,我在上篇提到過,HP gc有它的缺點(diǎn)。
C++不能完全控制指針,所以HP gc說過,它是“保守的”垃圾回收。

而我這個(gè),就是精確的。  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-20 00:15 | 路過
精確的?!Are you kidding?!  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-02-20 22:41 | yindf
@路過

呵呵,只要是用gc malloc 分配出來的,都可以保證在不用的時(shí)候,通過collect收集。 HP gc不行。  回復(fù)  更多評(píng)論
  
# re: C++下垃圾回收器的實(shí)現(xiàn)(二)--析構(gòu)函數(shù)的地址?
2010-04-06 09:30 | 不知所謂
樓主你去看看樓上說的那本書好不咯?你這個(gè)所謂gc簡直就是幼稚得搞笑  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

常用鏈接

留言簿(4)

隨筆檔案

文章分類

文章檔案

相冊(cè)

好友博客

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久99国产精品免费| 亚洲高清在线精品| 亚洲欧洲日本mm| 亚洲欧美日韩国产一区二区三区 | 欧美不卡高清| 亚洲综合欧美日韩| 欧美精品一区在线| 亚洲国产成人av| 久久伊人精品天天| 欧美一区三区二区在线观看| 国产老肥熟一区二区三区| 亚洲在线1234| 亚洲在线观看视频| 国产精品视频1区| 欧美一级片一区| 午夜久久影院| 精品成人一区二区| 欧美电影资源| 欧美女激情福利| 亚洲素人一区二区| 亚洲精品中文字幕在线观看| 欧美理论电影在线播放| 亚洲无限乱码一二三四麻| 一本大道久久精品懂色aⅴ| 欧美四级在线观看| 欧美一区日本一区韩国一区| 午夜视频在线观看一区二区三区 | 91久久视频| 亚洲国产另类精品专区| 欧美日韩123| 亚洲综合99| 久久国产99| 日韩午夜av在线| 一区二区精品在线| 久久aⅴ乱码一区二区三区| 一区二区三区免费观看| 一区二区三区欧美视频| 国产精品手机在线| 免费在线日韩av| 欧美日韩国产综合在线| 欧美一区二区黄| 久久aⅴ国产紧身牛仔裤| 在线观看欧美黄色| 亚洲精品视频在线看| 国产精品盗摄久久久| 浪潮色综合久久天堂| 欧美久久精品午夜青青大伊人| 亚洲在线一区二区三区| 久久久久国产精品午夜一区| 99精品黄色片免费大全| 午夜在线播放视频欧美| 亚洲激情自拍| 亚洲欧美国产不卡| 亚洲欧洲日产国码二区| 亚洲视频香蕉人妖| 在线观看91久久久久久| 99国产精品自拍| 1024成人| 香蕉国产精品偷在线观看不卡| 亚洲国产精品免费| 欧美一级播放| 免费毛片一区二区三区久久久| 亚洲自拍三区| 欧美激情一区三区| 久久视频在线视频| 国产精品久久久久aaaa| 亚洲高清色综合| 国产亚洲午夜| 亚洲一区三区电影在线观看| 亚洲人成毛片在线播放女女| 欧美在线视频一区二区三区| 亚洲色诱最新| 欧美激情中文不卡| 老鸭窝91久久精品色噜噜导演| 国产精品久久久久免费a∨| 一区二区三区精品视频在线观看| 欧美日本高清| 欧美黄色一区| 黑丝一区二区三区| 亚洲一区精品视频| 亚洲小少妇裸体bbw| 欧美暴力喷水在线| 欧美成熟视频| 黄色成人在线网站| 欧美在线中文字幕| 欧美亚洲综合网| 欧美性色视频在线| 一区二区三区视频在线看| 日韩一区二区福利| 欧美不卡视频一区发布| 免费人成精品欧美精品| 国模精品娜娜一二三区| 午夜精品一区二区在线观看| 欧美一区二区三区成人| 国产精品一国产精品k频道56| 一区二区三区精品国产| 亚洲女同同性videoxma| 国产精品国内视频| 亚洲一区二区三| 亚洲欧美日产图| 国产精品私拍pans大尺度在线| 亚洲一级一区| 午夜精品免费| 国产欧美一区二区三区沐欲 | 欧美国产日本韩| 亚洲黄网站在线观看| 日韩视频免费观看| 欧美日韩视频在线观看一区二区三区| 亚洲国产欧美精品| 一本色道久久综合亚洲精品按摩 | 中国成人亚色综合网站| 亚洲激情av在线| 欧美成人黄色小视频| 亚洲人午夜精品| 亚洲一区二区在线观看视频| 国产精品手机在线| 久久先锋资源| 亚洲欧洲三级| 亚洲尤物在线| 在线观看欧美亚洲| 欧美激情综合五月色丁香| 亚洲一区精品在线| 国产精品综合久久久| 久久久噜噜噜久久| 亚洲日本一区二区| 欧美一区二区三区在线观看| 在线观看欧美精品| 欧美日韩成人综合| 欧美亚洲网站| 亚洲国产美女| 欧美中文字幕在线观看| 亚洲国产精品嫩草影院| 欧美视频在线观看 亚洲欧| 亚洲欧美综合| 亚洲大胆av| 欧美一区二区三区在线| 亚洲欧洲午夜| 国产精品国内视频| 久久综合网络一区二区| 99国产欧美久久久精品| 久久久久国产精品www| 99视频精品免费观看| 国产综合激情| 欧美视频日韩视频在线观看| 久久精品一区二区| 亚洲一区免费| 亚洲欧洲综合| 久久视频这里只有精品| 亚洲综合日韩在线| 亚洲精品国产精品国自产观看浪潮| 国产精品丝袜久久久久久app| 欧美不卡视频一区发布| 午夜一区在线| 亚洲视频在线观看| 亚洲国产精品女人久久久| 久久久久久久久一区二区| 亚洲私人影院| 99在线精品视频在线观看| 亚洲国产成人久久| 欧美午夜精品一区| 欧美高清在线| 免费视频最近日韩| 久久久一区二区| 午夜视频久久久久久| 亚洲一区国产| 亚洲在线1234| 亚洲性线免费观看视频成熟| 亚洲精品1区| 亚洲高清123| 欧美激情在线免费观看| 媚黑女一区二区| 麻豆精品国产91久久久久久| 久久久久国色av免费观看性色| 亚洲欧美一区二区精品久久久| 中文成人激情娱乐网| 一区二区国产精品| 国产精品99久久久久久有的能看| 亚洲美女中出| 日韩一级裸体免费视频| 亚洲午夜精品17c| 亚洲视频狠狠| 亚洲一区二区免费| 亚洲欧美在线播放| 亚洲一区国产精品| 亚洲欧美综合精品久久成人| 午夜久久久久久久久久一区二区| 亚洲男人的天堂在线| 亚洲资源av| 西瓜成人精品人成网站| 欧美一区二视频在线免费观看| 久久久777| 欧美成人在线网站| 亚洲国产综合在线| 日韩天堂在线观看| 亚洲天堂黄色| 久久国产主播精品| 另类激情亚洲| 欧美日韩国产首页| 国产精品一级| 亚洲欧洲综合另类|