Garbage collection Libraries in C++什么免费和商业垃圾收集库可用于C ++,每个库的优缺点是什么? 我对来自该领域实际使用的来之不易的教训感兴趣,而不是营销或宣传模糊。 没有必要详细说明与自动垃圾收集相关的常规权衡,但请提及所使用的算法(引用计数,标记和扫描,增量等)并简要总结后果。 我过去使用过Boehm收藏家并取得了很大的成功。它是开源的,可用于商业软件。 它是一个保守的收藏家,并且由垃圾收集技术领域最重要的研究人员之一拥有悠久的发展历史。 Boost有很多智能指针,可以引用引用计数或删除范围退出或侵入引用计数。这些已经证明足以满足我们的需求。一个很大的优点是它都是免费的,开源的,模板化的C ++。因为它是引用计数,在大多数情况下,当对象被破坏时它是高度确定的。 我经常使用boehm-gc。它很简单,但文档很差。有一个C ++页面,但很难找到。 基本上,您只需确保每个类都继承自其基类,并始终将gc_allocator传递给容器。在许多情况下,您希望使用libgccpp来捕获new和delete的其他用法。这些都是高级别的更改,我们发现我们可以使用#ifdef在编译时关闭GC,并且支持它只会影响一个或两个文件。 我的主要问题是你不能再使用Valgrind了,除非你先关掉收集器。虽然关闭收集器很容易做到,并且不需要重新编译,但如果你开始耗尽内存,显然不可能使用它。 Boehm垃圾收集器是免费提供的,据说相当不错(没有亲自体验) ([PDF警告]关于Boehm垃圾收集器的C ++ 0x提议的理论论文) 它最初被称为制作C ++ 0x,但毕竟不会制作它(由于我想的时间限制)。 Proprosal N2670(对垃圾收集器的最小支持)确实在2008年6月获得批准,因此当编译器实现接受这个,并且标准最终确定时,C ++的垃圾收集世界肯定会改变...... 在GC中,GC的主要困难是需要处理不合作的模块。即,处理从未用GC编写的库。 这就是为什么经常建议使用Boehm GC的原因。 我所知道的唯一一个是Boehm,底部是传统的标记和扫描。它可能使用各种技术来优化这一点,但通常增量/生成/压缩GC很难为C ++创建,而无需使用诸如.Net C ++之类的托管子集。需要移动指针的一些方法可以通过编译器支持来实现,虽然固定指针或读/写块,但是对性能的影响可能太大,并且它不一定是GC的非平凡变化。 阅读本文并仔细研究结论:
是的,最后一句是主观的,也是圣战的一部分。 您还可以使用Microsoft的托管C ++。 CLR和GC非常可靠并用于服务器产品,但您必须使用CLR类型来实际收集GC - 您不能只重新编译现有代码并删除所有删除语句。 我宁愿使用C#编写全新的代码,但Managed C ++允许您以更加进步的方式改进代码库。 这是我在寻找同样的东西时发现的商业产品 HnxGC http://hnxgc.harnixworld.com/ 在当天,还有一款名为Great Circle的产品来自Geodesic Systems,但看起来他们不再销售。不知道是否将产品卖给了其他任何人。 |