gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:31:17 27 4
gpt4 key购买 nike

将垃圾收集语言编译为 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com