Tag: 缺点

如何有效地引用计数cons细胞(检测周期)?

我需要制作一些liblisp (在C11中),它需要处理基本函数,就像libobjc为Objective-C语言libobjc那样。 编辑 我正在将问题重写为不太通用的问题。 我得到了这样的实现: 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单元格(它使用带引用计数对象的内存池)。 我还可以使用cons_is_managed来检查cons单元是否在内存池中(因此您可以使用外部定义的单元格,而不是使用cons_init创建的单元格(如静态数据))。 我怎么能在这里有效地实现自动引用计数,如果有人调用cons_set_car或cons_set_cdr ,如果void *参数是一个被管理的cons单元,它会增加引用计数? 后宫和乌龟的问题在这里没有用,因为每个单元都有两种可能的方法(如果汽车或cdr是conses它可能无处可去),它们可以是列表,树或图形。 我应该注册cons_set_car / cons_set_cdr中使用的外部(非托管)conses,以便找到涉及它们的循环,但我仍然不确定如何有效地执行此操作。 由于这是一个更受控制的上下文,然后是图形中的一般循环(节点上最多两个顶点),我是否有机会在线性时间内完成此操作并避免垃圾收集(这将是我的计划B)? 主要问题是这是任何函数式语言的核心,所以这些函数会被调用很多次(比如obj_msgSend ),它们是瓶颈。 谢谢。 在另一种方法上,简化问题:如何在基于引用计数的语言上实现cons单元格,如Objective-C + ARC或Vala?