• <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里面有一個垃圾收集器。  回復  更多評論
              
            久久久久久精品无码人妻| 久久99国产精品久久99果冻传媒| 久久亚洲国产午夜精品理论片| 久久久久高潮毛片免费全部播放| 国产91色综合久久免费分享| 久久av高潮av无码av喷吹| 一本色综合久久| 一本色道久久99一综合| 久久久久高潮毛片免费全部播放 | 精品无码久久久久久久动漫| 狠狠色伊人久久精品综合网| 久久国语露脸国产精品电影| 亚洲一本综合久久| 99蜜桃臀久久久欧美精品网站| 99久久精品国产免看国产一区| 亚洲精品99久久久久中文字幕| 久久久老熟女一区二区三区| 久久久久久国产a免费观看不卡| 久久w5ww成w人免费| 久久夜色精品国产亚洲av| 日韩人妻无码一区二区三区久久| 久久久久九国产精品| 嫩草影院久久国产精品| 一本久道久久综合狠狠爱| 久久国产视屏| 伊人久久大香线焦综合四虎| 久久精品国产99久久久| 亚洲欧美成人综合久久久| 亚洲伊人久久成综合人影院| 久久青草国产精品一区| 久久精品一区二区三区不卡| 久久综合噜噜激激的五月天| 久久久久99这里有精品10| 久久久久亚洲AV无码专区网站| 精品国产91久久久久久久| 久久99精品久久久久久久不卡| 免费无码国产欧美久久18| 国产精品亚洲综合久久| 一级做a爰片久久毛片免费陪 | 国产精品一区二区久久精品无码| 国产综合久久久久|