c - 编译为 C 时的垃圾收集

标签 c compiler-construction garbage-collection

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

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

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

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

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

我的问题是:编译为 C 时垃圾收集的最新技术是什么。请注意,我并不是指在用 C 编程时进行垃圾收集的便捷方式(这是 Boehm 垃圾收集器的目标),只是一种在编译为 C 时进行垃圾回收的方法。

最佳答案

Potentially every time a function is called, you need to save the local variables in a data structure.

不,你不需要 - 你可以将局部变量留在 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;
}

但是,如果您想支持延续/非本地跳转,则必须跳过一些主要障碍。在这种情况下,堆分配所有内容会更容易。

关于c - 编译为 C 时的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4603701/

相关文章:

c - 如何基于 C 代码创建转换图

c++ - 错误 : expected constructor, 析构函数,或 ';' token 之前的类型转换?

javascript - 我的 HTML5 游戏时不时会卡顿,如何判断是不是垃圾回收引起的?

c - exec 系列函数的工作

c - 乘以和增加战俘

c++ - 哪些 C++(98/03) 特性没有得到糟糕的编译器的很好支持?

Java - 为什么 GC 时间会随着堆的增长(就容量而言)而增加?

php - 内存泄漏?!在 'create_function' 中使用 'array_map' 时,垃圾收集器是否正常运行?

c - 在函数 ‘yylex’ : 'Variable’ undeclared 中

c - 为什么变量在程序的一个部分中打印正确,而在另一部分中打印不正确