• <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   管理


            国产美女久久久| 国产精品99久久久精品无码| 91精品国产91久久久久福利| 久久精品人人做人人爽电影蜜月| 69久久夜色精品国产69| 国产精品免费久久久久久久久| 久久精品一区二区三区中文字幕| 久久久久久国产精品美女 | 久久精品国产亚洲AV大全| 99久久99久久精品国产| 伊人热热久久原色播放www| 999久久久免费精品国产| 久久受www免费人成_看片中文| AV无码久久久久不卡蜜桃| 中文字幕精品无码久久久久久3D日动漫| 久久久久久亚洲AV无码专区| 亚洲人成电影网站久久| 亚洲国产精品久久66| 久久狠狠高潮亚洲精品| 奇米影视7777久久精品人人爽| 99久久国产综合精品五月天喷水| 久久天堂AV综合合色蜜桃网| 婷婷国产天堂久久综合五月| 久久久久久久亚洲精品| 久久se精品一区精品二区国产| 精品亚洲综合久久中文字幕| 九九久久自然熟的香蕉图片| 色婷婷综合久久久久中文一区二区| 97香蕉久久夜色精品国产| 亚洲人成无码网站久久99热国产| 久久国产精品一区| 久久国产美女免费观看精品| 久久精品国产欧美日韩| 久久久久亚洲精品天堂久久久久久| 99久久综合国产精品二区| 国产激情久久久久影院| 久久精品国产亚洲Aⅴ香蕉 | 五月丁香综合激情六月久久| 久久人妻AV中文字幕| 欧美牲交A欧牲交aⅴ久久| 无码人妻久久一区二区三区免费|