垃圾收集C ++库
什么免费和商业垃圾收集库可用于C + +,每个的优缺点是什么?
我感兴趣的是来自实际使用领域的难得的教训,而不是营销或促销活动。
没有必要详细说明与自动垃圾收集相关的常规权衡,但请务必提及使用的algorithm(引用计数,标记和扫描,增量等),并简要总结其后果。
过去我曾经使用Boehm收集器 ,取得了很好的成绩。 它是开源的,可以在商业软件中使用。
它是一个保守的collections家,并且由垃圾收集技术领域最重要的研究人员之一拥有悠久的开发历史。
Boost提供了大量的智能指针 ,这些指针能够引用引用计数或删除范围内的退出或入侵引用计数。 这些已经足够certificate我们的需要。 一大优点是它是免费的,开源的,模板化的C ++。 因为它是引用计数,在大多数情况下,当一个对象被破坏时它是高度确定的。
Boehm垃圾收集器是免费的,据说相当不错(没有亲身体验)
([PDF警告]关于Boehm垃圾回收器的C ++ 0xbuild议的理论文章)
它最初被认为是C ++ 0x ,但毕竟不会 (因为时间的限制)。
Proprosal N2670 (对垃圾收集器的最小支持)在2008年6 月份获得了批准,所以编译器实现了这一点,并且标准得到最终确定,C ++的垃圾收集世界肯定会改变…
我使用了很多boehm-gc。 这是直接使用,但文件是非常贫穷的。 有一个C ++页面,但很难find。
基本上,你只要确保每个类都从它们的基类inheritance,并且总是将gc_allocator传递给一个容器。 在许多情况下,您想使用libgccpp来捕获新的和删除的其他用途。 这些主要是高层次的变化,我们发现我们可以在编译时使用#ifdef来closuresGC,支持这个只影响一个或两个文件。
我的主要问题是你不能再使用Valgrind,除非你先closures收集器。 虽然closures收集器很容易,但不需要重新编译,但如果内存不足,显然不可能使用它。
我唯一知道的是博姆,博姆在底部是一个传统的标记和扫描。 它可能使用各种技术来优化这个,但是通常增量/代数/压缩GC将很难为C ++创build,而不用去pipe理子集,比如使用.Net C ++得到的。 一些需要移动指针的方法可以通过固定指针或读/写块的编译器支持来实现,但是对性能的影响可能太大,并且不一定是GC的重要改变。
GC在C ++中遇到的主要困难是需要处理GC中不合作的模块。 即处理从未考虑过GC的图书馆。
这就是为什么常常提出Boehm GC的原因。
我find了一个商业产品,只是寻找同样的东西
HnxGC http://hnxgc.harnixworld.com/
早在当时,还有一个叫做Geodesic Systems公司的产品,叫做Great Circle,但现在看起来不像他们那样卖了。 不知道是否把产品卖给其他人。
您也可以使用Microsoft的Managed C ++。 CLR和GC在服务器产品中非常稳定和可用,但是您必须使用CLRtypes来实际收集GC – 您不能只重新编译现有代码并删除所有删除语句。
我宁愿使用C#编写全新的代码,但托pipeC ++可以让您以更为先进的方式发展您的代码库。
仔细阅读以下结论:
结论
- 复杂的解决scheme,简单的解决scheme被广泛使用的问题,将被改进的C + + 0x留给我们很less的需要。
- 我们几乎没有经验,推荐的语言function将被标准化。
- 修复不好的软件复杂的系统将永远不会工作。
build议做一些小的语言修改来改进未来的GC支持 – 例如,禁止隐藏指针(xor list trick)。
最后 – 正面说明“C ++不好,因为它没有GC”参数。 C ++不会生成垃圾,所以不需要GC 。 很明显,Java,C#,Objective C等产生大量的垃圾。
是的,最后一句话是主观的,也是圣战的一部分。
我使用C ++,因为我不喜欢有人需要为我清理垃圾的想法。
市政府这样做,这对我来说就够了。
如果你需要GC使用另一种语言。 为正确的工作select正确的工具。