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

            隨筆分類

            我的博客

            搜索

            •  

            積分與排名

            • 積分 - 304348
            • 排名 - 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里面有一個垃圾收集器。  回復  更多評論
              
            亚洲国产成人精品91久久久 | 久久无码精品一区二区三区| 精品综合久久久久久97超人| 中文字幕一区二区三区久久网站| 亚洲人成无码网站久久99热国产 | 久久国产精品波多野结衣AV| 亚洲国产成人精品女人久久久 | 精品久久人人爽天天玩人人妻| 青青草国产97免久久费观看| 久久久精品2019免费观看| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 嫩草影院久久国产精品| 亚洲人成网站999久久久综合| 久久99中文字幕久久| 久久无码AV中文出轨人妻| 99久久精品免费看国产免费| 国产三级久久久精品麻豆三级| 天天综合久久一二三区| 9191精品国产免费久久| 精品少妇人妻av无码久久| 色青青草原桃花久久综合| 国产精品成人99久久久久 | 91久久国产视频| 久久精品无码专区免费东京热| 久久久黄色大片| 一个色综合久久| 日韩AV毛片精品久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 成人综合伊人五月婷久久| 亚洲va久久久噜噜噜久久| 久久精品桃花综合| 久久精品极品盛宴观看| 久久久久国产精品三级网| 久久国产午夜精品一区二区三区| 色综合久久88色综合天天| 品成人欧美大片久久国产欧美...| 51久久夜色精品国产| 久久婷婷人人澡人人| 日韩久久久久中文字幕人妻 | 久久偷看各类wc女厕嘘嘘| 成人午夜精品无码区久久 |