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