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

            隨筆分類

            我的博客

            搜索

            •  

            積分與排名

            • 積分 - 303681
            • 排名 - 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里面有一個垃圾收集器。  回復  更多評論
              
            久久久久久无码Av成人影院| 思思久久99热只有频精品66 | 99久久久精品| 久久久久国产精品| 久久久噜噜噜久久| 中文国产成人精品久久不卡| 精品亚洲综合久久中文字幕| 人人狠狠综合久久亚洲高清| 精品久久久久久无码专区| 精品免费久久久久国产一区| 久久精品青青草原伊人| 国产视频久久| 久久精品国产亚洲AV无码偷窥| 久久亚洲电影| 国产免费久久精品99久久| 久久久久人妻一区精品色| 久久午夜无码鲁丝片午夜精品| 99国产欧美精品久久久蜜芽| 丁香色欲久久久久久综合网| 欧美一级久久久久久久大片| 久久久久一区二区三区| 久久精品夜夜夜夜夜久久| 久久午夜夜伦鲁鲁片免费无码影视| 久久精品国产福利国产秒| 久久99精品久久久久婷婷| 久久国产欧美日韩精品| 亚洲国产一成久久精品国产成人综合| .精品久久久麻豆国产精品| 亚洲AV成人无码久久精品老人| 中文成人无码精品久久久不卡| 99久久无码一区人妻| 日本精品久久久久中文字幕8| 久久久精品2019免费观看| 色8久久人人97超碰香蕉987| 77777亚洲午夜久久多喷| 天天影视色香欲综合久久| 亚洲国产小视频精品久久久三级| 污污内射久久一区二区欧美日韩 | 久久精品国产亚洲AV蜜臀色欲 | 一日本道伊人久久综合影| 人人狠狠综合88综合久久|