gpt4 book ai didi

garbage-collection - 用 glib 收集垃圾?

转载 作者:行者123 更新时间:2023-12-04 07:52:15 29 4
gpt4 key购买 nike

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

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

考虑到无论如何我都有垃圾收集器的所有开销,理想情况下我想做的就是简单地关闭 glib 的引用计数并将垃圾收集器用于所有事情。这将无限简化界面,并有望提高性能。

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

说服 glib 使用 libgc 真的可行吗?如果是这样,我可能会面临哪些其他问题?什么样的 glib 性能影响会强制所有分配通过 libgc 生成(而不是使用当前在 glib 中的优化分配器)?

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

最佳答案

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

了解语言绑定(bind)如何工作(代理对象、切换引用)可能有助于思考这一点。

更新:哦,从听到 Boehm GC 开始,我认为您正试图用 GC 替换 g_malloc 等,就像在那个旧帖子中一样。

如果您正在执行语言绑定(bind)(不是 GC'ing C/C++),那么是的,这是可以实现的。 gjs(SpiderMonkey JavaScript)代码库是一个非常易于阅读的好例子。

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

您必须将代理对象存储在 GObject 上,以便将其取回(比如有人做了 widget.get_parent(),然后您需要通过从 C GObject 中检索它来返回先前设置为父对象的相同对象) .显然,您还必须能够从代理对象转到 C 对象。

关于garbage-collection - 用 glib 收集垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6240031/

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