用glib进行垃圾收集?

2024-04-17

我想将垃圾收集语言(具体来说,它使用古老的 Boehm libgc)与 glib 系列 API 接口。

glib 和 gobject 在内部使用引用计数来管理对象生命周期。包装这些的正常方法是使用垃圾收集的对等对象,该对象保存对 glib 对象的引用,并在对等点完成时删除该引用;这意味着当应用程序使用对等点时,glib 对象保持活动状态。我之前已经这样做过,并且它有效,但它非常痛苦并且有其自身的问题(例如生成同一底层对象的两个对等点)。

鉴于我已经承担了垃圾收集器的所有开销anyway,理想情况下我想做的是简单地关闭 glib 的引用计数并使用垃圾收集器来处理所有事情。这将无限简化界面并有望提高性能。

从表面上看,这似乎相当简单 --- 将垃圾收集器终结器连接到 glib 对象终结器,并将 ref 和 unref 函数重写为 noops --- 但进一步的调查表明,事情远不止这些: glib例如,非常喜欢保留自己的分配器池,当然我让它这样做,垃圾收集器假设池中的所有内容都是活动的,并且会泄漏。

说服 glib 使用 libgc 实际上可行吗?如果是这样,我可能还会遇到哪些其他问题?什么样的 glib 性能影响会迫使所有分配都通过 libgc 生成(而不是使用当前 glib 中的优化分配器)?

(glib 文档确实说它应该与垃圾收集器干净地接口......)


http://mail.gnome.org/archives/gtk-devel-list/2001-February/msg00133.html http://mail.gnome.org/archives/gtk-devel-list/2001-February/msg00133.html老了 但仍然相关。

学习语言绑定如何工作(代理对象、切换引用)可能有助于思考这个问题。

更新:哦,从 Boehm GC 听到的消息中,我认为您正在尝试用 GC 替换 g_malloc 等,就像那篇旧文章中那样。

如果您正在进行语言绑定(而不是 GC'ing C/C++),那么是的,这是非常可以实现的。 gjs (SpiderMonkey JavaScript) 代码库是一个很好且易于管理的示例。

基本思想是,您将拥有一个“保存”GObject 的代理对象,并且通常具有对该 GObject 的唯一引用。但是,唯一的复杂性是切换引用:http://mail.gnome.org/archives/gtk-devel-list/2005-April/msg00095.html http://mail.gnome.org/archives/gtk-devel-list/2005-April/msg00095.html

您必须将代理对象存储在 GObject 上,以便可以将其取回(假设有人执行 widget.get_parent(),那么您需要通过从 C GObject 检索它来返回之前设置为父对象的同一对象) 。显然,您还必须能够从代理对象转到 C 对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用glib进行垃圾收集? 的相关文章

随机推荐

  • 使用标准 C++/C++11,14,17/C 检查文件是否存在的最快方法?

    我想找到最快的方法来检查标准 C 11 14 17 或 C 中是否存在文件 我有数千个文件 在对它们进行操作之前 我需要检查它们是否全部存在 我可以写什么来代替 SOMETHING 在下面的函数中 inline bool exist con
  • 如何在 cakephp 3.x 中执行自定义查询

    cakephp 中的自定义查询执行 我已经应用了下面的代码 conn ConnectionManager get default rs conn gt query SELECT FROM customers 但它给了我空白数组custome
  • 通过更改 build.xml 和 ant.properties 生成 Android 代码覆盖率

    我一直在尝试为我的 android 测试项目生成 android 代码覆盖率 该项目测试包含外部 jar 的 android 项目 当我运行命令时 ant emma install debug test 它仅显示了 android 项目的覆
  • PHP:删除数组的第一项和最后一项

    假设我有这个数组 array array 10 20 30 30 40 50 问题 从上面的数组中删除第一项的最快 最简单的方法是什么 从上面的数组中删除最后一项的最快 最简单的方法是什么 因此生成的数组仅包含这些值 20 30 30 40
  • 构建后如何在 Windows 上安装 Qt?

    我找不到任何有关如何安装基于 Windows 的 Qt 的信息 在维基文章中如何在 Mac 和 Linux 上设置影子构建 http developer qt nokia com wiki Qt shadow builds有描述 prefi
  • SQL Server 导入和导出向导导出到 PostgreSQL 时出错

    我正在尝试使用 SQL Server 的导入和导出向导 SQL Server 2008 R2 导出 SQL Server 数据库 数据库模式在目标 PostgreSQL 数据库中创建得很好 大部分数据也是如此 仅当我尝试导出具有以下内容的列
  • org.apache.hadoop.security.AccessControlException:尝试在 EC2 上使用 Hadoop Java API 通过 s3n URI 访问 S3 存储桶时权限被拒绝

    Scenario 我创建一个名为 my role 的 AWS IAM 角色 将 EC2 指定为可信实体 即使用信任关系策略文档 Version 2012 10 17 Statement Sid Effect Allow Principal
  • 获取 ORA-02391: SESSIONS_PER_USER 限制

    是否有一个查询可以用来获取我可以同时使用的会话数量 我正在线程化一些数据库连接并收到错误 ORA 02391 超出同时 SESSIONS PER USER 限制 我怎样才能得到这个限制的值 从这个查询开始找出您正在使用多少个会话 selec
  • 具有动态别名的动态虚拟主机

    我在用DNSMasq对于此设置 我在使用 Alias 时遇到问题 因为它对于动态虚拟主机根本不起作用 并且不存在这样的事情VirtualAlias在 Apache 文档中 我正在尝试像以前一样设置我的新环境 devtld 但我遇到了问题 因
  • 使用 Unity 3D 移动鼠标时相机跟随玩家

    我有一个简单的脚本 当我转动相机时 可以移动和环顾四周 但相机不随角色转动 我如何让它们一起转动 using System Collections Generic using UnityEngine public class PlayerF
  • React.js - 在表单提交时和之后显示一条消息

    提交表单时 我想显示 请稍候 并在成功提交后显示从服务器返回的数据 使用 jQuery 这很容易做到 但应该有一种 React 方式 因为 React 不喜欢这种直接的 DOM 操作 我认为 1 我对吗 2 如何在表单提交时 而不是之后 显
  • 如何改进此代码的功能[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 a1 input Enter an 8 bit binary number to convert a1 list a1 ok False i
  • JavaFX FXML 控制器 - 构造函数与初始化方法

    My Application类看起来像这样 public class Test extends Application private static Logger logger LogManager getRootLogger Overri
  • 是否可以使用多线程而不需要一遍又一遍地创建线程?

    首先 再次感谢所有已经回答我问题的人 我不是一个经验丰富的程序员 这是我第一次体验多线程 我有一个与我的问题非常相似的例子 我希望这可以缓解我们的情况 public class ThreadMeasuring private static
  • 使用 python 进行简单的 ascii url 编码

    看那个 import urllib print urllib urlencode dict bla 输出是 bla C3 BC 我想要的很简单 我想要 ascii 格式的输出而不是 utf 8 格式的输出 所以我需要输出 bla C3 如果
  • 此链接内的链接和跨度的文本装饰

    我有类似的链接 a href Link text span Link sub text span a 悬停时 我需要跨度内的文本不带下划线装饰 但主链接文本是 是否可以 我试过了 a hover span text decoration n
  • 如何更改列表中的ListStyle

    在 SwiftUI 中List似乎有一个名为ListStyle 如何更改列表的样式 struct ListView View var body some View NavigationView List Item create identi
  • jQuery document.ready 与 pageLoad

    我从另一位开发人员那里挑选了一个现有项目 我在代码中注意到他们正在三个不同的事件处理程序中执行 js 代码 function pageLoad execute code document ready function execute cod
  • ASP.NET MVC 中 ViewModel 的验证

    大多数关于如何在 ASP NET MVC 中实现验证的技巧似乎都以模型为中心 在模型和控制器之间构建服务层 或者使用验证属性装饰模型的属性 在我的应用程序中 我使用 ViewModel 进行控制器和视图之间的所有通信 我的登录页面有一个名为
  • 用glib进行垃圾收集?

    我想将垃圾收集语言 具体来说 它使用古老的 Boehm libgc 与 glib 系列 API 接口 glib 和 gobject 在内部使用引用计数来管理对象生命周期 包装这些的正常方法是使用垃圾收集的对等对象 该对象保存对 glib 对