编译为C时的垃圾收集

Jul*_*les 17 c compiler-construction garbage-collection

将垃圾收集语言编译为C时,垃圾收集的技术有哪些?我知道两个:

  1. 维护一个影子堆栈,在数据结构中显式保存所有根

  2. 使用像Boehm这样的保守垃圾收集器

第一种技术很慢,因为你必须维护阴影堆栈.每次调用函数时,都需要将局部变量保存在数据结构中.

第二种技术也很慢,并且由于使用了保守的垃圾收集器,本质上不会回收所有垃圾.

我的问题是:在编译为C时,垃圾收集的最新技术是什么.注意,在C语言编程时,这并不意味着进行垃圾收集的方便方式(这是Boehm垃圾收集器的目标),只是一种方式编译为C时进行垃圾收集.

Chr*_*oph 6

每次调用函数时,都需要将局部变量保存在数据结构中.

不,你没有 - 你可以将局部变量保留在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)

但是,如果你想支持延续/非局部跳跃,你将不得不跳过一些重大的箍.在这种情况下,堆分配一切更容易.