将垃圾收集语言编译为C时,垃圾收集的技术有哪些?我知道有两个:
维护一个影子堆栈,将所有根显式保存在数据结构中
使用像 Boehm 这样的保守垃圾收集器
第一种技术很慢,因为您必须维护影子堆栈。可能每次调用函数时,您都需要将局部变量保存在数据结构中。
第二种技术也很慢,并且由于使用保守的垃圾收集器,本质上不会回收所有垃圾。
我的问题是:编译为 C 时垃圾收集的最新技术是什么。请注意,我并不是指在用 C 编程时进行垃圾收集的便捷方法(这是 Boehm 垃圾收集器的目标),只是一种方法进行垃圾收集时编译为C.
可能每次调用函数时,您都需要将局部变量保存在数据结构中。
不,您不需要 - 您可以将局部变量保留在 C 堆栈上并仍然迭代它们:将所有引用变量放入一个数组中,并将指向该变量的指针添加到一个链表中,在输入新变量时向该链表添加一个节点堆栈框架。
Mockup:
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;
}
但是,如果您想支持延续/非本地跳转,则必须克服一些主要障碍。在这种情况下,对所有内容进行堆分配会更容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)