• <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)

            隨筆分類

            我的博客

            搜索

            •  

            積分與排名

            • 積分 - 305324
            • 排名 - 84

            最新評(píng)論

            閱讀排行榜

            繼上一篇,現(xiàn)在可以來(lái)看看gc_malloc的源碼了,初窺究竟。
             1void*
             2gc_malloc(size_t sz,void *parent,void (*finalizer)(void *))
             3{
             4    void *ret=my_malloc(sz);
             5    int id=map_id(ret);
             6    E.pool[id].u.n.finalizer=finalizer;
             7    if (parent) {
             8        gc_link(parent,0,ret);
             9    }

            10    else {
            11        stack_push(id);
            12    }

            13    return ret;
            14}

            首先,第4行分配了指定大小的內(nèi)存。
            然后是第5行map_id(ret),這是什么呢?先不深究其實(shí)現(xiàn),我簡(jiǎn)單的說(shuō)說(shuō)他所做的工作:
            因?yàn)檫@是一個(gè)gc庫(kù),所以本質(zhì)工作就是管理內(nèi)存,因此將分配出來(lái)的新內(nèi)存記錄到一個(gè)容器中以便于以后的管理。yfgc管理采用的容器是一個(gè)數(shù)組。分配新內(nèi)存后,在數(shù)組容器中找到一個(gè)空閑的位置,將內(nèi)存指針記錄到該位置上。
            不過(guò)光做這個(gè)還是不夠的,以后要是再遇上這塊內(nèi)存,怎么知道它被記錄在數(shù)組容器的哪個(gè)位置上呢?雖然遍歷查找也可以,不過(guò)我想應(yīng)該沒(méi)人會(huì)那么做吧。源碼采用了hash_map,將這塊內(nèi)存的指針map到數(shù)組的索引上。
            綜上,map_id(ret)大體這么做了
            pool[id].mem = ret;
            map[ ret ] 
            = id;
            不過(guò)由于這個(gè)gc庫(kù)是用C寫的,沒(méi)有STL,里面的代碼就不可能那么簡(jiǎn)單啦。

            總而言之,id就是內(nèi)存在容器中的索引啦。從第6行可以看出,E.pool就是這個(gè)管理容器了。這句用來(lái)設(shè)置內(nèi)存的析構(gòu)回調(diào)函數(shù)。

            E.pool是一個(gè)node結(jié)構(gòu)數(shù)組,現(xiàn)在來(lái)看看node的定義,簡(jiǎn)單起見(jiàn),我暫時(shí)去掉了不相關(guān)的東西:
            1struct node {
            2    union {
            3        struct {
            4            void * mem;
            5            struct link *children;
            6            void (*finalizer)(void *);
            7        }
             n;
            8    }
             u;
            9}
            ;
            mem和finalizer很眼熟對(duì)吧,因?yàn)閯倓偛趴催^(guò)。children可以先不管,不過(guò)從名稱看來(lái),是管理父子關(guān)系,更準(zhǔn)確的說(shuō)是依賴關(guān)系的東東了。

            OK,現(xiàn)在來(lái)看看7、8、9行,出現(xiàn)了gc_link,我記得這是一個(gè)public接口,用來(lái)管理兩塊內(nèi)存之間的依賴關(guān)系的?,F(xiàn)在,因?yàn)閭魅肓藀arent實(shí)參,要在新分配的內(nèi)存和parent之間建立依賴關(guān)系,所以調(diào)用了gc_link。

            我想else部分可以先不管,只要記住出現(xiàn)了stack_push即可?,F(xiàn)在非常好奇,gc_link是如何建立這一依賴關(guān)系的,采用了何種數(shù)據(jù)結(jié)構(gòu),所以接下來(lái)就要去看看gc_link的實(shí)現(xiàn)了。
            posted on 2008-09-11 19:53 LOGOS 閱讀(1954) 評(píng)論(1)  編輯 收藏 引用

            FeedBack:
            # re: 垃圾收集的那點(diǎn)事(B) 2008-09-11 20:20 陳梓瀚(vczh)
            我在博客上的vczh free script里面有一個(gè)垃圾收集器。  回復(fù)  更多評(píng)論
              

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


            色偷偷91久久综合噜噜噜噜| 国产A三级久久精品| 久久精品国产第一区二区| 久久午夜夜伦鲁鲁片免费无码影视 | 伊人久久精品影院| 欧洲人妻丰满av无码久久不卡| 四虎国产精品免费久久5151| 九九精品久久久久久噜噜| 中文字幕亚洲综合久久2| 亚洲av成人无码久久精品| 精品久久久久中文字| 色88久久久久高潮综合影院| 日韩久久久久中文字幕人妻| 久久线看观看精品香蕉国产| 久久久SS麻豆欧美国产日韩| 久久久久国产亚洲AV麻豆| 国产精品久久网| 人妻精品久久无码区| 久久99九九国产免费看小说| 久久久99精品成人片中文字幕| 久久99国产精品久久99果冻传媒| 一本一道久久综合狠狠老 | 久久精品人人做人人爽电影| 亚洲人成精品久久久久 | 久久综合九色综合网站| 国产亚洲精品久久久久秋霞| 午夜精品久久久内射近拍高清 | 成人午夜精品无码区久久 | 国产精品久久99| 国产综合久久久久| 久久99精品国产| 亚洲成色999久久网站| 久久综合九色综合久99| 久久最近最新中文字幕大全 | 精品久久久中文字幕人妻| 久久久久久久免费视频| 综合久久一区二区三区 | 久久久WWW成人免费精品| 久久精品中文字幕一区| 一本久道久久综合狠狠躁AV| 午夜天堂av天堂久久久|