将垃圾收集语言编译为 C 时,垃圾收集技术有哪些?我知道两个:
维护一个将所有根显式保存在数据结构中的影子堆栈
使用像 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/