On The Road
(cond ((less 'code) (less 'bug)))
C++博客
首页
新随笔
联系
聚合
管理
随笔 - 119 文章 - 290 trackbacks - 0
博客搬家了哦,请移步
叫我abc
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(12)
给我留言
查看公开留言
查看私人留言
随笔分类
《GAME PROGRAMMING GEMS6》读书笔记(4)
《UNIX编程艺术》读书笔记(4)
month-flow(5)
mysql入门(3)
垃圾收集(4)
我的博客
叫我abc
博客搬家啦
搜索
积分与排名
积分 - 301915
排名 - 84
最新评论
1. re: C++ std::fstream open mode
i'am got
--hdj
2. re: cppcheck的使用
你好,你会使用cppcheck吗?@robert
--wqq
3. re: 垃圾收集的那点事(H)
非常感谢
--7Qing_
4. re: 高效调用lua函数
为什么提示没有findLuaItem这个函数?
--sdfasf
5. re: android ndk调试知识[未登录]
博主你好,请问如果没有.so的源代码,应该如何进行arm的汇编级调试呢?
--dennis
阅读排行榜
1. cppcheck的使用(16931)
2. 十步精通新语言(10624)
3. 内存池实现(9864)
4. 高效调用lua函数(9201)
5. 在lua脚本中使用unicode(8157)
垃圾收集的那点事(C)
昨天看了gc_malloc,了解到分配一块内存后,需要将其管理起来。此外,如parent参数有效的话,还需要建立新内存和parent内存之间的依赖关系。
先看看gc_link的定义
gc_link(
void
*
parent,
void
*
prev,
void
*
now)
这个函数的功能就是,在parent和now之间建立依赖关系,以表明parent在某种形式上引用着now。同时取消parent和prev之间的依赖关系,表明parent不再通过某种形式引用prev了。parent、prev和now,都是由这个gc分配出来的内存。
比如 A->b = c,可以写为
gc_link( A , A
->
b , c );
接下来看看gc_link的代码
1
void
2
gc_link(
void
*
parent,
void
*
prev,
void
*
now)
3
{
4
int
parent_id;
5
if
(parent
==
0
)
{
6
parent_id
=
0
;
7
}
8
else
{
9
parent_id
=
map_id(parent);
10
}
11
if
(prev)
{
12
int
prev_id
=
map_id(prev);
13
stack_push(prev_id);
14
node_add(parent_id,prev_id
|
UNSET_MASK);
15
}
16
if
(now)
{
17
node_add(parent_id,map_id(now));
18
}
19
}
先看看5、6、7、8、9行,如果parent有效的话,则通过 map_id() 将它放到 E.pool中管理。可是这个parent明显是在更早的时候分配的内存,所以可以肯定 map_id() 在这里执行的是查找功能,而没有往 E.pool中做插入操作。map_id()这个函数还是可以暂时忽略不看。
parent_id即parent在 E.pool中的索引。
如果parent无效的话,parent_id = 0,这有可能说明,E.pool的第0个节点是一个特殊节点。如果parent作为整个库分配出来的第一块内存的话,那么在分配的时候也就没有什么东西可以引用他,除了这个gc库以及应用程序。所以制定了 E.pool[ 0 ]来表示这种引用,和他建立依赖关系的内存,可以保持和整个gc库一样长的生命周期,直到gc_exit。
11、12、13、14行,是用来解除parent和prev的依赖关系的,相比16、17行建立parent和now的依赖关系,代码有点多。所以先来看看如何建立内存间的依赖关系。
node_add( parent_id , now_id )
map_id()我就不再重复说明了,代码简化后的形式如上。他将通过建立parent_id和now_id之间的联系,来表达parent和now内存之间的依赖关系。
posted on 2008-09-12 20:15
LOGOS
阅读(1577)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理