-->

如何有效地引用计数缺点细胞(检测周期)?(How to efficiently reference

2019-10-18 17:49发布

我需要某种liblisp (在C11),这将需要处理的基本功能,很像什么libobjc做了Objective-C语言。

编辑

我rewritting问题较少通用的东西。

我有这样一个实现:

typedef struct cons {
  void *car, *cdr;
} *cons_t;

cons_t cons_init(void *, void *);
void *cons_get_car(cons_t);
void *cons_get_cdr(cons_t);
void cons_set_car(cons_t, void *);
void cons_set_cdr(cons_t, void *);
void cons_free(cons_t);
bool cons_is_managed(cons_t);

所以,我可以做一个利弊细胞(它使用参照计算对象的内存池)。 我还可以使用cons_is_managed来检查利弊细胞是内存池里面(这样你就可以使用外部定义的细胞,而不是与创建cons_init (如静态数据)。

我怎么能有效地实现自动引用计数这里,使得如果有人致电cons_set_carcons_set_cdr会递增引用计数,如果void *参数是一个管理cons单元?

在后宫和乌龟问题就不会在这里很有用,因为每个单元有两种可能的方式去(和它哪儿都不能去,如果汽车也CDR是conses之外),也可以是表,树或图形。

我应该注册使用在外部(非管理)conses之外cons_set_car / cons_set_cdr ,以便找到涉及它们的周期,但我仍然不知道如何有效地做到这一点。

由于这是一个更controled方面则一般周期曲线图(两个顶点的节点上最大),是否有任何机会,我可以以线性的时间做到这一点,避免了垃圾收集(这将是我的B计划)?

主要的问题是,这是任何功能性语言的核心,所以这些功能将被调用了很多次(如obj_msgSend ),他们瓶颈。

谢谢。


在不同的方法,以简化问题:一个人如何可以实现基于引用计数语言,像Objective-C的+ ARC或瓦拉一个cons单元?

Answer 1:

我假设你的目标是要实现引用计数的主要目标是高效的垃圾回收(即使你说“避免垃圾收集”,很显然,你的目标是实现自动内存管理)。

首先,我会建议你考虑是否要改用某种追查垃圾收集 ,如最现代化的Lisp实现使用。 其和参考计数垃圾收集之间的基本差为正对到存储器的负相关关系:参考计数,分配元件被假定为活直到证明否则(典型地通过一个图的遍历算法)。 与跟踪,分配元件被假定为垃圾直到(从根组对象,如REPL接口的可达性)被证明否则。

是的,你可以在标记和清除算法运行,但取决于你与你的库瞄准的使用可能是值得的,得到一个偶然显著的性能影响。 同样,如果你仔细地管理线程,你可以有一个核心处理生活垃圾收集,而另一个继续执行。 最有效地,有混合策略,如执行“廉价”引用计数不能处理周期的时间的高频容易箱子护理,然后使用追踪方法,以收集垃圾循环作为它积累。

至于如何有效地做到这一点......如果你想要做的引用计数,你需要存储每一个利弊数。 为什么不把它存储在结构?

typedef struct cons {
   void *car, *cdr;
   size_t reference_count;
} *cons_t;

如果采用混合策略,然后像在地图,减少,并递归函数列表处理高频操作可以在O(n)的时间,其中n是被垃圾收集元件的数目来处理。



文章来源: How to efficiently reference count cons cells (detecting cycles)?