[讨论] 引用计数和着色法管理对象生命周期

ljs_nogard 2011-10-13
我是做成一个叫 mpt r的智能指针 的形式来实现 引用计数染色法的。


既然是C++的智能指针,那就要有几个使用限制:

1. mptr 所指向的对象都必须由特定的内存池分配,否则无法保存一些额外信息
2. mptr 所管理的对象,如果要使用别的指针,那么 mptr 不负责这些指针所指对象的释放

还有一个是必要条件,但不算是限制的,就是 mptr 有能力判断自己是位于 栈上 还是堆上;
如果mptr是作为一个堆上的对象,那它有没有父对象,父对象在哪里,父对象的额外信息(例如颜色表),都可以很快地找出来。
这个怎么实现就不具体说了,很长,反正已经实现了。


接下来是一些算法所要保持的性质(都是必要条件):

1. 如果一个对象具有某(几)种颜色,那么这个对象所包含的 mptr (子对象,subobject)所指向的对象,也必定具有这(几)种颜色;也可以简单说成 mptr 具有这几种颜色

2. 如果一个对象具有某一种颜色,那么它也一定知道,至多有多少个具有同样颜色这种颜色的对象指向它。

3. 如果一个对象,被若干个具有同一种颜色的 mptr 所指,若全部这些 mptr 已经宣告生命周期结束,或者已经褪去这种颜色,那么这个对象也同时褪去这种颜色

4. 在栈上的 mptr (根对象所在)一开始(即未被其他 mptr 赋值前)只能有一种颜色,并且是独一无二的颜色(新颜色)。


如何判断一个非根对象可回收(充分条件):

1. 该对象褪去所有颜色
2. 该对象具有的所有颜色,其根对象已经消亡或者已转成其他颜色。(所以这里暗示的是,一个对象的引用计数,至少应该分为两部分,来自根对象的引用,来自非根对象的引用)


上面应该没有遗漏的了,有说得不清楚的地方欢迎提问。

正确性证明,在纸上写是很难的啦,所以我是打算用代码来做,省时省力。
而且某些极端的情况下,要保持上面的性质运算量还是蛮大的。

这个思路有很多种实现的算法,欢迎各位自己去实现,独立验证。



下面粘贴一个补充法则,和验证过程:
http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=21665972&ptid=3615619

如果 ABC 成环, DEF 成环, 现在  C需要新指向一个新结点 K, 它不知道 K之后会怎么操作, K如何上色?

而后另一个新结点 M 指向B, 同样M怎么上色?

如果之后再将 K指向 D, K, DEF环怎么上色?

之后 E指向 M 形成一个新环, 又是怎么上色?

--------------------------------------------------

首先告诉你我是怎样实现颜色传递的,规则如下:

1. 如果 x 和 y 的颜色表的交集为空,那么就将 x 颜色表的 key 作为一项加入 y 的颜色表中
2. 如果 x 和 y 的颜色表的交集非空,那么就将 x 和 y 的颜色表合并成一个,可以赋予一个新的颜色值,但要保持推算出原有颜色的能力。

以下是你的例子的过程:

1. ABC,具有颜色 1,然后C指向A,因为发现A和C拥有同一种颜色,那么 ABC三节点的颜色表合并成一个(就是说 ABC 三个颜色表的key 对应的 value 相同),怎么合并这个就比较复杂了……

2. DEF 成环,具有颜色 2,后面同理

3. C指向K,按规则1

4. 新节点M,应该是从根节点出发的,所以本身先具有颜色3,
M 指向 B, 应该是M将颜色传递给B,而不是M的颜色受影响。这样,ABC 的颜色表中要再增加一个M的颜色表的 key的项 (注意,不是value),因为M 和ABC没有共同的颜色(规则1)
此时可以归纳出 ABC 环具有 颜色 1,3

5. K 再指向 D,同样不影响K 的颜色,但是 DEF 的颜色表中要增加一个 K 的颜色表key 的项。此时 可以归纳出 DEF 环同时具有颜色 1 , 2, 3

6. E 指向 M,因为 M 已经具有颜色 3,E具有颜色 1,2,3,所以应该合并 M 和 E 的颜色表的key。 这样,从ABC中也可以归纳出他们同时具有颜色1,2,3


所以,我之前说了,某些极端情况下,颜色表的归纳和合并,是需要很大量的运算的。
不过多数情况下,会比遍历对象好。

如果加以优化,应该代价会更小一些。




最后更新于(Nov 24)

ljsnogard_at_gmail_dot_com
易卡螺丝君 2011-10-13
obj-c就是引用计数来管理内存的
ljs_nogard 2011-10-13
不知道 objective-C 是否也解决了循环引用问题?

忘了说,我的想法是用一种智能指针
而不是像boost那样由程序员自行判断shared_ptr或是weak_ptr的方案
易卡螺丝君 2011-10-13
obj-c有弱引用

还有GC 不过iphone上的obj-c不支持gc
写给mac os的应用可以适用gc
RednaxelaFX 2011-10-13
易卡螺丝君 写道
obj-c有弱引用

还有GC 不过iphone上的obj-c不支持gc
写给mac os的应用可以适用gc

iOS 5上有Automatic Reference Counting (ARC)方式实现的GC
易卡螺丝君 2011-10-13
ios5 刚出 我还在看其中改进

多谢fx君指出ARC
Global site tag (gtag.js) - Google Analytics