Dav*_*ven 6 garbage-collection glib
我想将垃圾收集语言(具体来说,它使用古老的Boehm libgc)与glib系列API接口.
glib和gobject在内部使用引用计数来管理对象的生命周期.包装它们的常规方法是使用垃圾收集的对等对象,该对象保存对glib对象的引用,并在对等方最终确定时删除引用; 这意味着当应用程序使用对等时,glib对象保持活动状态.我以前做过这个,但它确实有效,但它很痛苦并且有自己的问题(例如生成同一个底层对象的两个对等体).
鉴于我无论如何都有垃圾收集器的所有开销,理想情况下我想做的只是关闭glib的引用计数并使用垃圾收集器来处理所有事情.这样可以简化界面,无疑可以提高性能.
从表面看来,这似乎相当简单 - 将一个垃圾收集器终结器连接到glib对象终结器,并将ref和unref函数覆盖为noops ---但进一步的调查显示它还有更多:glib例如,他非常喜欢保留自己的分配器池,当然我让它这样做垃圾收集器假设池中的所有东西都是活的并且它会泄漏.
说服glib使用libgc实际上是否可行?如果是这样,我可能面临的其他问题是什么?什么样的glib性能影响会强制所有分配通过libgc产生(而不是使用当前在glib中的优化分配器)?
(glib文档确实说它应该干净地与垃圾收集器接口......)
不。
自从问这个问题以来,我发现 libgc 不会搜索第三方库拥有的内存以获取引用。这意味着,如果 glib 在其自己的工作空间中拥有对通过 libgc 分配的对象的唯一引用,libgc 将收集它,然后您的程序将崩溃。
libgc 仅可安全地用于主程序拥有的对象。
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |