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

            博客搬家了哦,請移步
            叫我abc

            常用鏈接

            留言簿(12)

            隨筆分類

            我的博客

            搜索

            •  

            積分與排名

            • 積分 - 303638
            • 排名 - 84

            最新評論

            閱讀排行榜

            繼上一篇,現在可以來看看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行分配了指定大小的內存。
            然后是第5行map_id(ret),這是什么呢?先不深究其實現,我簡單的說說他所做的工作:
            因為這是一個gc庫,所以本質工作就是管理內存,因此將分配出來的新內存記錄到一個容器中以便于以后的管理。yfgc管理采用的容器是一個數組。分配新內存后,在數組容器中找到一個空閑的位置,將內存指針記錄到該位置上。
            不過光做這個還是不夠的,以后要是再遇上這塊內存,怎么知道它被記錄在數組容器的哪個位置上呢?雖然遍歷查找也可以,不過我想應該沒人會那么做吧。源碼采用了hash_map,將這塊內存的指針map到數組的索引上。
            綜上,map_id(ret)大體這么做了
            pool[id].mem = ret;
            map[ ret ] 
            = id;
            不過由于這個gc庫是用C寫的,沒有STL,里面的代碼就不可能那么簡單啦。

            總而言之,id就是內存在容器中的索引啦。從第6行可以看出,E.pool就是這個管理容器了。這句用來設置內存的析構回調函數。

            E.pool是一個node結構數組,現在來看看node的定義,簡單起見,我暫時去掉了不相關的東西:
            1struct node {
            2    union {
            3        struct {
            4            void * mem;
            5            struct link *children;
            6            void (*finalizer)(void *);
            7        }
             n;
            8    }
             u;
            9}
            ;
            mem和finalizer很眼熟對吧,因為剛剛才看過。children可以先不管,不過從名稱看來,是管理父子關系,更準確的說是依賴關系的東東了。

            OK,現在來看看7、8、9行,出現了gc_link,我記得這是一個public接口,用來管理兩塊內存之間的依賴關系的。現在,因為傳入了parent實參,要在新分配的內存和parent之間建立依賴關系,所以調用了gc_link。

            我想else部分可以先不管,只要記住出現了stack_push即可。現在非常好奇,gc_link是如何建立這一依賴關系的,采用了何種數據結構,所以接下來就要去看看gc_link的實現了。
            posted on 2008-09-11 19:53 LOGOS 閱讀(1951) 評論(1)  編輯 收藏 引用

            FeedBack:
            # re: 垃圾收集的那點事(B) 2008-09-11 20:20 陳梓瀚(vczh)
            我在博客上的vczh free script里面有一個垃圾收集器。  回復  更多評論
              
            亚洲国产精品成人久久蜜臀 | 色8激情欧美成人久久综合电| 久久www免费人成看片| 香蕉久久永久视频| 久久精品天天中文字幕人妻| 91精品国产高清91久久久久久| 精品多毛少妇人妻AV免费久久| 香蕉久久夜色精品国产2020| 午夜久久久久久禁播电影| 国产AⅤ精品一区二区三区久久| 久久受www免费人成_看片中文| 潮喷大喷水系列无码久久精品| 久久人妻少妇嫩草AV无码蜜桃| 伊人色综合久久天天人手人婷| 91精品无码久久久久久五月天| 亚洲综合伊人久久大杳蕉| 免费精品99久久国产综合精品| 国产aⅴ激情无码久久| 国产精品伊人久久伊人电影| 无码AV波多野结衣久久| 亚州日韩精品专区久久久| 精品久久久噜噜噜久久久| 色综合久久夜色精品国产| 99热都是精品久久久久久| 久久成人国产精品| 人妻无码αv中文字幕久久琪琪布| 久久精品国产清自在天天线| 婷婷五月深深久久精品| 性做久久久久久免费观看| 久久艹国产| 狠狠色丁香婷婷综合久久来来去| Xx性欧美肥妇精品久久久久久| 国产精品久久久久9999| 久久亚洲熟女cc98cm| 久久综合九色欧美综合狠狠| 久久国产综合精品五月天| 亚洲国产精品婷婷久久| 99久久精品国产麻豆| 97精品久久天干天天天按摩| 久久精品夜夜夜夜夜久久| 99热成人精品热久久669|