On The Road
(cond ((less 'code) (less 'bug)))
C++博客
首頁(yè)
新隨筆
聯(lián)系
聚合
管理
隨筆 - 119 文章 - 290 trackbacks - 0
博客搬家了哦,請(qǐng)移步
叫我abc
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(12)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
《GAME PROGRAMMING GEMS6》讀書(shū)筆記(4)
《UNIX編程藝術(shù)》讀書(shū)筆記(4)
month-flow(5)
mysql入門(3)
垃圾收集(4)
我的博客
叫我abc
博客搬家啦
搜索
積分與排名
積分 - 305324
排名 - 84
最新評(píng)論
1.?re: C++ std::fstream open mode
i'am got
--hdj
2.?re: cppcheck的使用
你好,你會(huì)使用cppcheck嗎?@robert
--wqq
3.?re: 垃圾收集的那點(diǎn)事(H)
非常感謝
--7Qing_
4.?re: 高效調(diào)用lua函數(shù)
為什么提示沒(méi)有findLuaItem這個(gè)函數(shù)?
--sdfasf
5.?re: android ndk調(diào)試知識(shí)[未登錄](méi)
博主你好,請(qǐng)問(wèn)如果沒(méi)有.so的源代碼,應(yīng)該如何進(jìn)行arm的匯編級(jí)調(diào)試呢?
--dennis
閱讀排行榜
1.?cppcheck的使用(17050)
2.?十步精通新語(yǔ)言(10688)
3.?內(nèi)存池實(shí)現(xiàn)(9901)
4.?高效調(diào)用lua函數(shù)(9261)
5.?在lua腳本中使用unicode(8233)
垃圾收集的那點(diǎn)事(B)
繼上一篇,現(xiàn)在可以來(lái)看看gc_malloc的源碼了,初窺究竟。
1
void
*
2
gc_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)的東西:
1
struct
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)論
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開(kāi)源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問(wèn)
Chat2DB
管理
Copyright ©2025 LOGOS Powered by:
博客園
模板提供:
滬江博客
国产美女久久久
|
国产精品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ⅴ久久
|
无码人妻久久一区二区三区免费
|