Jul*_*les 17 c compiler-construction garbage-collection
将垃圾收集语言编译为C时,垃圾收集的技术有哪些?我知道两个:
维护一个影子堆栈,在数据结构中显式保存所有根
使用像Boehm这样的保守垃圾收集器
第一种技术很慢,因为你必须维护阴影堆栈.每次调用函数时,都需要将局部变量保存在数据结构中.
第二种技术也很慢,并且由于使用了保守的垃圾收集器,本质上不会回收所有垃圾.
我的问题是:在编译为C时,垃圾收集的最新技术是什么.注意,在C语言编程时,这并不意味着进行垃圾收集的方便方式(这是Boehm垃圾收集器的目标),只是一种方式编译为C时进行垃圾收集.
每次调用函数时,都需要将局部变量保存在数据结构中.
不,你没有 - 你可以将局部变量保留在C堆栈上并仍然遍历它们:将所有引用变量放在一个数组中,并将一个指针添加到链接列表中,在输入新的时将一个节点附加到该链接列表堆栈框架.
小样:
struct vm
{
struct scope *root;
};
struct scope
{
struct scope *prev, *next;
size_t size;
struct ref *refs;
};
void foo(struct vm *vm, struct scope *caller)
{
struct ref local_refs[42];
struct scope scope = {
caller, NULL, sizeof local_refs / sizeof *local_refs, local_refs };
caller->next = &scope;
// ...
caller->next = NULL;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你想支持延续/非局部跳跃,你将不得不跳过一些重大的箍.在这种情况下,堆分配一切更容易.