哪些免费的和商业的垃圾收集库可用于C ++,每种都有哪些优缺点?
我对在该领域的实际使用中来之不易的教训感兴趣,而不是市场营销或促销宣传中的教训。
无需详细说明与自动垃圾收集相关的通常的取舍,但是请务必提及所使用的算法(引用计数,标记和清除,增量等),并简要总结其后果。
哪些免费的和商业的垃圾收集库可用于C ++,每种都有哪些优缺点?
我对在该领域的实际使用中来之不易的教训感兴趣,而不是市场营销或促销宣传中的教训。
无需详细说明与自动垃圾收集相关的通常的取舍,但是请务必提及所使用的算法(引用计数,标记和清除,增量等),并简要总结其后果。
Answers:
shared_ptr
有用的“确定性”想法。本地对象实例上的析构函数可确定地运行-我们知道它在退出封闭块时执行。但是在与相同的情况下shared_ptr
,我们所知道的是refcount已减少。整个问题的关键shared_ptr
是我们不知道该对象是否在其他地方仍然需要,因此我们无法在本地确定该对象何时被销毁。如果您需要在退出某个范围之前关闭“文件句柄”对象,请不要使用shared_ptr
。
我经常使用boehm-gc。使用起来很简单,但是文档确实很差。有一个C ++页面,但是很难找到。
基本上,您只需确保每个类都从其基类继承,并且始终将gc_allocator传递给容器。在许多情况下,您想使用libgccpp来捕获new和delete的其他用途。这些主要是高层更改,我们发现可以在编译时使用#ifdef关闭GC,支持该更改仅会影响一个或两个文件。
我的主要问题是,除非您先关闭收集器,否则您将无法再使用Valgrind。关闭收集器很容易做到,并且不需要重新编译,但是,如果开始耗尽内存,显然不可能使用它。
Boehm垃圾收集器是免费提供的,并且据说还不错(没有亲身经历)
([PDF警告]关于Boehm垃圾收集器的C ++ 0x建议的理论论文)
最初据说是C ++ 0x ,但毕竟不会(由于我认为时间限制)。
Proprosal N2670(对垃圾收集器的最小支持)确实在2008年6月获得批准,因此随着编译器实现的发展,以及标准的最终确定,C ++的垃圾收集世界肯定会发生变化...
我所知道的唯一一个是Boehm,它的底部是传统的标记和横扫。它可能使用各种技术来对此进行优化,但是通常如果不使用托管子集(如.Net C ++所能提供的),就很难为C ++创建增量/世代/压缩GC。某些需要移动指针的方法可以通过编译器支持固定指针或读/写块的方式来实现,但对性能的影响可能太大,并且不一定对GC进行重大更改。
从GC的角度来看,C ++中GC的主要困难是需要处理不合作的模块。即,处理从未考虑过GC的库。
这就是为什么经常建议使用Boehm GC的原因。
这是我在寻找同一东西时发现的一种商业产品
HnxGC http://hnxgc.harnixworld.com/
过去,还有一个来自Geodesic Systems的名为Great Circle的产品,但看起来不再像以前那样卖了。不知道是否将产品出售给其他人。
您也可以使用Microsoft的Managed C ++。CLR和GC非常牢固,并用于服务器产品中,但是必须使用CLR类型才能使GC实际收集-您不能只重新编译现有代码并删除所有delete语句。
我宁愿使用C#编写全新的代码,但是Managed C ++允许您以更渐进的方式发展代码库。
阅读此内容并仔细查看结论:
结论
解决问题的复杂解决方案已被广泛使用,并且可以通过C ++ 0x加以改进,因此我们几乎不需要。
我们对建议的标准语言功能几乎没有经验。
修复不良的软件复杂系统将永远无法进行。
建议对次要语言进行更改以改善将来对GC的支持-例如,不允许隐藏指针(“异或列表技巧”)。
最后-正视“ C ++不好,因为它没有GC”这一说法。C ++不会产生垃圾,因此不需要GC。显然,Java,C#,Objective C等会产生大量垃圾。
是的,最后一句话是主观的,也是圣战的一部分。
我使用C ++是因为我不喜欢有人需要为我清除垃圾的想法。
市政厅做到了,对我来说就足够了。
如果需要GC,请使用其他语言。为正确的工作选择正确的工具。