【发布时间】:2011-06-04 23:35:22
【问题描述】:
我想将一种垃圾收集语言(具体来说,它使用古老的 Boehm libgc)连接到 glib 系列 API。
glib 和 gobject 在内部使用引用计数来管理对象的生命周期。包装这些的常规方法是使用垃圾回收的对等对象,该对象持有对 glib 对象的引用,并在对等对象完成时删除该引用;这意味着 glib 对象在应用程序使用对等点时保持活动状态。我以前做过这个,它可以工作,但是它很痛苦并且有它自己的问题(例如产生同一个底层对象的两个对等点)。
鉴于我已经获得了垃圾收集器的所有开销无论如何,理想情况下我想做的就是简单地关闭 glib 的引用计数并将垃圾收集器用于所有事情。这将无限简化界面并有望提高性能。
从表面上看,这似乎相当简单 --- 将垃圾收集器终结器连接到 glib 对象终结器,并将 ref 和 unref 函数覆盖为 noops --- 但进一步的调查表明,这不仅仅是那:例如,glib 非常喜欢保留自己的分配器池,当然我让垃圾收集器假设池中的所有内容都是活动的并且会泄漏。
说服 glib 使用 libgc 真的可行吗?如果是这样,我可能会面临哪些其他问题?什么样的 glib 性能影响会强制所有分配通过 libgc 生成(而不是使用当前在 glib 中的优化分配器)?
(glib 文档确实说它应该干净地连接到垃圾收集器...)
【问题讨论】: