编译为 C 时的垃圾收集

2024-03-24

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

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

  2. 使用像 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(使用前将#替换为@)

编译为 C 时的垃圾收集 的相关文章

随机推荐

  • 更改重复键阈值 C++

    我正在构建一个 C 俄罗斯方块游戏 不是 C Net 我感觉我的控制很奇怪 我想要做到这一点 以便当用户按下其中一个箭头键时 按住它大约 10 毫秒将启动 Windows 的重复功能 默认设置为 500 毫秒左右 对于我的游戏来说太延迟了
  • Bash shell 脚本检查器

    我必须编写一个脚本 它获取一个文本文件 其中包含 9 行和行中的 9 个数字 1 9 例如 123456789 234567891 345678912 456789123 567891234 678912345 789123456 8912
  • 在 JavaScript 中使用 filter() 查找两个未排序数组的交集的 Big O

    我刚刚开始学习 Big O 表示法 我试图理解不同函数的 Big O 看看哪个更好 我正在努力计算时间和空间复杂度对于以下代码 function findCommonElem arr1 arr2 let result arr1 filter
  • 如何在本地恢复`.git/index`?

    我不小心删除了 git index 有办法恢复吗 它已被永久删除 我还没有做出任何事 要重建索引文件 您可以尝试以下两个命令 git reset re scan the working directory git add u update
  • 任务“:app:kaptDebugKotlin”执行失败。当干净构建时

    我在使用 cmd 构建项目时遇到问题 当我使用 android studio 构建项目时没问题 但是当我清理项目然后使用 cmd 构建时出现错误 这个命令 gradlew assemble调试 这个错误 失败 构建失败并出现异常 什么地方出
  • 将 scala 2.10 future 转换为 scalaz.concurrent.Future // 任务

    有人找到了如何将 scala 的 Future 2 10 正确转换为新的 scalaz7 future 的代码吗 我知道很想通过 scala Promise 将 scalaz future 转换为 scala Future 但不知道如何正确
  • 获取当前正在运行的应用程序

    如何获取当前正在运行的应用程序 我想检查应用程序是否正在运行或不在服务中 我为此使用了以下代码 ActivityManager activityManager ActivityManager this getSystemService AC
  • Swift - Firebase 函数signInWithEmail 在第一次调用时不执行

    IBAction func loginEmailButton sender AnyObject FIRAuth auth signInWithEmail email text password password text completio
  • WPF 中透明背景变黑

    我尝试创建一个带有圆角的窗口 我将窗口背景设置为透明并将边框背景设置为白色 然而 在边框和窗口之间的区域 我得到黑色背景而不是透明背景 我在 Windows 7 上使用 C WPF VS2010 进行开发 下面是我的 XAML 和屏幕截图
  • 将具有循环结构的 JS 对象存储在本地存储中,并在重新加载时获取循环结构

    我想存储 本地存储 HTML5 JS 对象 为此 我必须申请JSON stringify obj 到我想要存储的JS对象 之后我就可以存储该对象localStorage obj JSON stringify obj 但有些 JS 对象非常大
  • 请教 php 总结 01 + 01 = 02

    我想在数据库中创建一个id id user gt 数据类型 varchar 我希望我的 id 从00 01 02 等等 为了创建新的 id 我对所有行进行计数 并且计数的结果将添加 01 Example id array 00 01 02
  • 处理块、完成处理程序、dispatch_async 与dispatch_sync

    我正在线程中执行在线数据获取 并且我想在执行块后立即执行某些操作 这是我的代码 IBAction refresh UIBarButtonItem sender NSLog checking self editToolbar dispatch
  • HM10 ble改变特征值AT命令Arduino

    谁能帮我用AT命令写入特征值 或者如何使用Hm10模块将数据从arduino发送到另一个ble设备 HM10发送AT START后 会通告数据包 并且可以检测服务和特征 但特征值是默认的0x00 如何更改 多次检查数据表 但找不到能够执行相
  • 托管 C++/CLI 类中的 auto_ptr 或 shared_ptr 等效项

    在 C CLI 中 您可以在托管类中使用本机类型 因为不允许在托管类中保存本机类的成员 在这种情况下您需要使用指针 这是一个例子 class NativeClass public ref class ManagedClass private
  • Discord.js v14 创建频道

    我尝试创建一个频道 但总是出现错误 我不知道如何解决它 不要注意 req 0 在 代码 中 它来自数据库 与问题没有链接 因为它在 v13 中工作 看来您的帖子主要是代码 请添加更多详细信息 我不知道我能得到什么更多的细节 哈哈 抱歉 英语
  • 在 Node.js 中的单个 HTTP 请求中调用多个 HTTP 请求

    我试图在单个 URL 调用中调用多个 URL 并将其 json 响应推送到数组中 然后将该数组发送给最终用户 我的代码如下所示 var express require express var main router express Rout
  • 我有一个 JApplet,它必须显示 3 个组件。 (2 个 JPanel 和 1 个 Paint 方法)

    我有一个作业 其中我必须允许用户使用二次方程绘制图表 我设法绘制了图形的骨架 现在我尝试显示 控制面板 以供用户输入值 我有4个文件 graph java panel java panelB java panelC java 我的问题是当我
  • 如何在 debian 上安装 apcu 作为 php7 扩展

    我看过这个ubuntu教程 http thereluctantdeveloper com 2015 12 quick and dirty php 70 set up on ubuntu 1404 with apcu http therelu
  • SQL Server 执行模拟

    两者有什么区别 execute as user testuser AND execute as login testuser 我正在这些登录名下执行跨数据库过程 它适用于作为登录名执行 但不适用于作为用户执行 这表示服务器主体 testus
  • 编译为 C 时的垃圾收集

    将垃圾收集语言编译为C时 垃圾收集的技术有哪些 我知道有两个 维护一个影子堆栈 将所有根显式保存在数据结构中 使用像 Boehm 这样的保守垃圾收集器 第一种技术很慢 因为您必须维护影子堆栈 可能每次调用函数时 您都需要将局部变量保存在数据