• <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>
            隨筆 - 119  文章 - 290  trackbacks - 0

            博客搬家了哦,請(qǐng)移步
            叫我abc

            常用鏈接

            留言簿(12)

            隨筆分類

            我的博客

            搜索

            •  

            積分與排名

            • 積分 - 305322
            • 排名 - 84

            最新評(píng)論

            閱讀排行榜

            最近寫新項(xiàng)目,希望能從內(nèi)存管理、指針引用的問題上前進(jìn)一小步,于是在網(wǎng)上爬出云風(fēng)以前寫的一個(gè)gc庫,姑且稱為yfgc吧
            粗看了一下接口,很少很正交,使用例子也非常簡(jiǎn)單。只是我對(duì)垃圾收集的原理不是很熟悉,又或者這些接口太接近gc的底層原理,因此我并不是很確定如何運(yùn)用這些接口。
            借用某句著名的話,“源碼面前,了無秘密”。為了了解如何運(yùn)用這些接口,我決定去看看這個(gè)不到1000行的gc庫的源碼,順便寫些東西,畢竟好久沒寫了。

            yfgc的地址
            svn地址:http://manualgc.googlecode.com/svn/trunk

            撇去weak table和再分配不談,yfgc有以下接口
             1void gc_init();
             2void gc_exit();
             3
             4void gc_enter();
             5void gc_leave(void *p,);
             6
             7void* gc_malloc(size_t sz,void *parent,void (*finalizer)(void *));
             8
             9void gc_link(void *parent,void *prev,void *now);
            10void gc_collect();

            先看幾個(gè)明顯易懂的
            gc_init,一看就知道是初始化這個(gè)gc庫的,約摸著底下也就是初始化一些數(shù)據(jù)結(jié)構(gòu),分配一些初始內(nèi)存等等。不過至于做了什么,以后再談。
            gc_exit,一看就知道是在程序退出時(shí)析構(gòu)gc庫的,多半是釋放內(nèi)存。如果實(shí)現(xiàn)不是很復(fù)雜的話,不調(diào)用這個(gè)函數(shù)也不會(huì)怎樣。
            gc_collect,一定是收集垃圾的了,不過現(xiàn)在就深入這個(gè)函數(shù)的話,一定是本末倒置。因?yàn)檫€不知道內(nèi)存在哪里分配,就去看內(nèi)存收集顯然是不對(duì)的。
            gc_malloc,可以肯定,這就是gc庫的內(nèi)存分配接口了。好吧,先看看這個(gè)函數(shù),我都有點(diǎn)迫不及待了。

            先看一下gc_malloc的三個(gè)參數(shù)
            1.sz,請(qǐng)求分配的內(nèi)存大小
            2.parent,按字面意思是父親,如果用工廠模式做類比的話,也許會(huì)更容易理解些。工廠生產(chǎn)一個(gè)對(duì)象,就申請(qǐng)一塊內(nèi)存,parent則是工廠本身。
            更通用和接近的解釋是,parent即持有或者用指針引用這塊新內(nèi)存的那些對(duì)象。垃圾收集的概念就是,當(dāng)一塊內(nèi)存在程序里不被任何對(duì)象持有或者指針引用的時(shí)候,它就是一塊廢棄的內(nèi)存,可以被系統(tǒng)回收。當(dāng)有任何一個(gè)指針引用著這塊內(nèi)存的時(shí)候,他就必然不能被回收。
            所以,parent這個(gè)參數(shù),或者說,新分配的內(nèi)存必須要比parent那塊內(nèi)存活得更長(zhǎng)久,因?yàn)閜arent擁有或者引用著這塊新分配的內(nèi)存。
            3.finalizer,析構(gòu)函數(shù),如果分配內(nèi)存用來實(shí)例化一個(gè)類的話,那么這塊內(nèi)存要回收的時(shí)候,顯然要有一個(gè)時(shí)機(jī)來調(diào)用類的析構(gòu)函數(shù)才行。這個(gè)回調(diào)函數(shù)正好可以完成這個(gè)任務(wù)。

            干脆寫一個(gè)yfgc的源碼解析系列好了

            posted on 2008-09-10 20:22 LOGOS 閱讀(4779) 評(píng)論(5)  編輯 收藏 引用 所屬分類: 垃圾收集

            FeedBack:
            # re: 垃圾收集的那點(diǎn)事(A) 2008-09-10 20:37 陳梓瀚(vczh)
            語言們用的垃圾收集器都不需要我們顯示collect而能夠在適當(dāng)?shù)臅r(shí)候【中斷程序】并【開始搜索并收集】。所以這個(gè)東西最多算個(gè)池。以前我見過一個(gè)可以在C++用的垃圾收集器,不用自己collect,他后臺(tái)自動(dòng)執(zhí)行了。

            這個(gè)gc看起來是讓你顯式地維護(hù)一個(gè)圖,然后手動(dòng)對(duì)一定不能收集的節(jié)點(diǎn)進(jìn)行標(biāo)記,然后自己collect。算是【理論上】實(shí)現(xiàn)了那個(gè)功能。  回復(fù)  更多評(píng)論
              
            # re: 垃圾收集的那點(diǎn)事(A) 2008-09-10 21:10 Don't tell u
            研究win2k泄漏代碼里面的gc似乎也是一種方法,雖然不像.net java那么徹底,似乎夠用,^_^。  回復(fù)  更多評(píng)論
              
            # re: 垃圾收集的那點(diǎn)事(A) 2008-09-10 21:14 LOGOS
            @陳梓瀚(vczh)
            不錯(cuò),確實(shí)如你所說,這東西強(qiáng)迫人手動(dòng)去維護(hù)依賴關(guān)系
            如果不這么做,就無法從中得到任何好處

            至于手動(dòng)collect,在我看來和后臺(tái)自動(dòng)collect無啥區(qū)別  回復(fù)  更多評(píng)論
              
            # re: 垃圾收集的那點(diǎn)事(A) 2008-09-10 22:45 陳梓瀚(vczh)
            還是有的,譬如new失敗的時(shí)候后臺(tái)可以中斷然后collect然后再幫你new。  回復(fù)  更多評(píng)論
              
            # re: 垃圾收集的那點(diǎn)事(A) 2008-09-11 15:49 空明流轉(zhuǎn)
            說實(shí)話我真覺得不比shared_ptr好多少,RAII才是C++一類貨的王道。  回復(fù)  更多評(píng)論
              
            无码人妻精品一区二区三区久久 | 国产精品九九九久久九九| A级毛片无码久久精品免费| 人妻精品久久久久中文字幕一冢本| 欧美丰满熟妇BBB久久久| 国产午夜精品理论片久久| 久久午夜福利无码1000合集| 国产精品99久久久久久人| 伊人色综合九久久天天蜜桃 | 亚洲国产精品无码久久久蜜芽 | 国产成人久久激情91| 久久亚洲国产精品123区| 国产高潮国产高潮久久久| 久久久这里有精品| 激情综合色综合久久综合| 久久久久国产精品熟女影院| 婷婷久久综合| 久久精品国产亚洲一区二区| 亚洲欧美成人综合久久久| 久久精品国产一区二区三区不卡| 久久婷婷国产综合精品| 人妻少妇精品久久| 国产毛片久久久久久国产毛片 | 久久亚洲AV成人出白浆无码国产| 狠狠色丁香婷婷综合久久来来去 | 伊人久久大香线蕉亚洲五月天| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 国内精品伊人久久久久av一坑| 国产精品亚洲综合久久| 91亚洲国产成人久久精品| 精品国产乱码久久久久久1区2区| 国产精品久久久久久久久久影院 | 婷婷伊人久久大香线蕉AV| 久久久久久久久久久精品尤物| 久久午夜无码鲁丝片午夜精品| 大香网伊人久久综合网2020| 久久久国产精品福利免费| 国内精品久久久久久久涩爱| 99久久精品免费观看国产| 免费精品久久久久久中文字幕 | 午夜精品久久久久9999高清|