垃圾收集C ++中的库

时间:2008-09-17 08:18:13

标签: c++ garbage-collection libraries

哪些免费和商业垃圾收集库可用于C ++,每种库的优缺点是什么?

我对来自该领域实际使用的来之不易的教训感兴趣,而不是营销或宣传模糊。

没有必要详细说明与自动垃圾收集相关的常规权衡,但请注意使用的算法(引用计数,标记和扫描,增量等)并简要总结后果。

9 个答案:

答案 0 :(得分:27)

我过去曾使用过Boehm collector取得了很好的成功。它是开源的,可以用于商业软件。

它是一位保守的收藏家,并且是垃圾收集技术领域最重要的研究人员之一,有着悠久的发展历史。

答案 1 :(得分:22)

Boost有很大范围的smart pointers,其中涉及引用计数或删除范围退出或侵入引用计数。这些已经证明足以满足我们的需求。一个很大的优点是它都是免费的,开源的,模板化的C ++。因为它是引用计数,在大多数情况下,当对象被破坏时它是高度确定的。

答案 2 :(得分:9)

The Boehm garbage collector是免费提供的,据说相当不错(没有第一手经验)

([PDF警告]关于C++0x proposal for the Boehm garbage collector)的理论文件

最初据说制作C ++ 0x , but will not make it after all(由于时间限制,我认为)。

Proprosal N2670(对垃圾收集器的最小支持)确实在2008年6月获得批准,因此当编译器实现接受这个,并且标准得到最终确定时,C ++的垃圾收集世界肯定会改变...

答案 3 :(得分:9)

我经常使用boehm-gc。它很简单,但文档很差。有一个C ++页面,但很难找到。

基本上,您只需确保每个类都继承自其基类,并始终将gc_allocator传递给容器。在许多情况下,您希望使用libgccpp来捕获new和delete的其他用法。这些是很大程度上的高级更改,我们发现我们可以使用#ifdef在编译时关闭GC,而支持它只会影响一个或两个文件。

我的主要问题是你不能再使用Valgrind了,除非你先关掉收集器。虽然关闭收集器很容易,而且不需要重新编译,但如果开始耗尽内存,显然不可能使用它。

答案 4 :(得分:2)

我所知道的唯一一个是Boehm,底部是传统的标记和扫描。它可能使用各种技术来优化这一点,但通常增量/生成/压缩GC很难为C ++创建,而无需使用诸如.Net C ++之类的托管子集。一些需要移动指针的方法可以通过编译器支持来实现,虽然固定指针或读/写块,但是对性能的影响可能太大,并且它不一定是GC的非平凡变化。 / p>

答案 5 :(得分:2)

在GC中,GC的主要困难是需要处理不合作的模块。即,处理从未用GC编写的库。

这就是为什么经常建议使用Boehm GC。

答案 6 :(得分:1)

这是我在寻找同样事物时发现的商业产品

HnxGC http://hnxgc.harnixworld.com/

在当天,还有一款名为Great Circle的产品来自Geodesic Systems,但看起来他们不再销售。不知道是否将产品卖给了其他任何人。

答案 7 :(得分:1)

您还可以使用Microsoft的托管C ++。 CLR和GC非常可靠并用于服务器产品,但您必须使用CLR类型来实际收集GC - 您不能只重新编译现有代码并删除所有删除语句。

我宁愿使用C#来编写全新的代码,但是托管C ++可以让您以更加进步的方式发展代码库。

答案 8 :(得分:1)

阅读this并仔细研究结论:

  

结论

     
      
  • 广泛使用简单解决方案的问题的复杂解决方案,并且将通过C ++ 0x改进,使我们不需要。
  •   
  • 对于要标准化的推荐语言功能,我们几乎没有经验。
  •   
  • 修复糟糕的软件复杂系统永远不会有效。
  •   
  • 推荐次要语言更改以改进将来的GC支持 - 禁止隐藏指针(xor list trick)作为一个示例。

  •   
  • 最后 - 正面解决“C ++坏了,因为它没有GC”的论点。 C ++不会产生垃圾,因此不需要GC 。显然,Java,C#,Objective C等会产生大量垃圾。

  •   

是的,最后一句话是主观的,也是圣战的一部分 我使用C ++是因为我不喜欢有人需要为我取出垃圾的想法 市政厅做到了这一点,这对我来说已经足够了 如果您需要GC使用其他语言。为正确的工作选择合适的工具。