我想将垃圾收集语言(特别是使用古老的Boehm libgc)与glib系列API进行交互。
glib和gobject在内部使用引用计数来管理对象的生命周期。包装它们的常规方法是使用垃圾收集的对等对象,该对象保存对glib对象的引用,并在对等体最终确定时删除引用;这意味着当应用程序使用对等时,glib对象保持活动状态。我以前做过这个,但是它很有效,但它很痛苦并且有自己的问题(例如生成同一个底层对象的两个对等体)。
鉴于我已经获得了垃圾收集器的所有开销,理想情况下我想做的只是关闭glib的引用计数并使用垃圾收集器来处理所有事情。这样可以简化界面,并希望提高性能。
从表面上看,这似乎相当简单 - 将垃圾收集器终结器连接到glib对象终结器,并将ref和unref函数覆盖为noops ---但进一步的调查显示它比例如:glib非常喜欢保留自己的分配器池,当然我让它做到这一点,垃圾收集器假设池中的所有东西都是活的并且它会泄漏。
说服glib使用libgc实际上是否可行?如果是这样,我可能面临的其他问题是什么?什么样的glib性能影响会强制所有分配通过libgc产生(而不是使用当前在glib中的优化分配器)?
(glib docs确实说它应该干净地与垃圾收集器接口......)
答案 0 :(得分:2)
http://mail.gnome.org/archives/gtk-devel-list/2001-February/msg00133.html已经过时了 但仍然相关。
学习语言绑定如何工作(代理对象,切换引用)可能有助于思考这一点。
更新:哦,从听到Boehm GC我以为你试图用GC取代g_malloc等,就像那篇旧帖子一样。
如果你正在进行语言绑定(而不是GC的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对象。
答案 1 :(得分:0)
对于将来的访问者,您可以参考这篇文章(不是我的):http://d.hatena.ne.jp/bellbind/20090630/1246362401。
用日语写的,但代码是可读的。
https://mail.gnome.org/archives/gtk-devel-list/2001-February/msg00133.html中提到的编辑选项也可以使用,我自己还没有测试过。
如果您遇到G_SLICE,还有另一个相关问题:http://www.hpl.hp.com/hosted/linux/mail-archives/gc/2011-January/004289.html。
答案 2 :(得分:0)
没有
自从问这个以来我发现libgc没有搜索第三方库拥有的内存以供参考。这意味着如果glib在其自己的工作空间中对通过libgc分配的对象的唯一引用,libgc将收集它,然后您的程序将崩溃。
libgc只能安全地用于主程序拥有的对象。