编译为 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# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 重载<<的返回值

    include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 更改重复键阈值 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 这样的保守垃圾收集器 第一种技术很慢 因为您必须维护影子堆栈 可能每次调用函数时 您都需要将局部变量保存在数据