C ++中的垃圾收集库
哪些免费的和商业的垃圾收集库可用于C ++,每种都有哪些优缺点?
我对在该领域的实际使用中来之不易的教训感兴趣,而不是市场营销或者促销宣传中的教训。
无需详细说明与自动垃圾收集相关的通常的取舍,但是请务必提及所使用的算法(引用计数,标记和清除,增量等),并简要总结其后果。
解决方案
回答
Boehm垃圾收集器是免费提供的,并且据说还不错(没有亲身经历)
([PDF警告]关于Boehm垃圾收集器的C ++ 0x建议的理论论文)
最初据说是用C ++ 0x制作的,但毕竟不会制作(由于我想受时间限制)。
Proprosal N2670(对垃圾收集器的最小支持)确实在2008年6月获得批准,因此随着编译器实现的发展,以及标准的最终确定,C ++的垃圾收集世界肯定会发生变化...
回答
过去,我使用Boehm收集器取得了成功。它是开源的,可以在商业软件中使用。
它是一个保守的收集器,并且由垃圾收集技术领域最重要的研究人员之一开发了很长的历史。
回答
我所知道的唯一一个是Boehm,它的底部是传统的标记和横扫。它可能使用各种技术来对此进行优化,但是如果不使用托管子集(如.Net C ++所能提供的),通常很难为C ++创建增量/世代/压缩GC。尽管一些需要移动指针的方法可以通过编译器支持固定指针或者读/写块的方式来实现,但是对性能的影响可能太大,并且不一定对GC进行重要的更改。
回答
Boost具有种类繁多的智能指针,这些指针隐含引用计数或者范围内删除或者侵入式引用计数。这些已经证明足以满足我们的需求。最大的优点是,它都是免费的,开放源代码的,模板化的C ++。因为它是引用计数,所以在大多数情况下,销毁对象时具有高度确定性。
回答
在GC中,使用C ++编写GC的主要困难是需要处理不合作的模块。即,处理从未考虑过GC的库。
这就是为什么经常建议使用Boehm GC的原因。
回答
这是我在寻找同一东西时发现的一种商业产品
HnxGC http://hnxgc.harnixworld.com/
过去,还有一个来自Geodesic Systems的名为Great Circle的产品,但看起来不再像以前那样卖了。不知道是否将产品卖给了其他人。
回答
我们也可以使用Microsoft的Managed C ++。 CLR和GC非常坚固,用于服务器产品中,但是我们必须对GC使用CLR类型来实际收集,而不仅仅是重新编译现有代码并删除所有delete语句。
我宁愿使用C编写全新的代码,但是Managed C ++可以让我们以更渐进的方式发展代码库。
回答
阅读此书并仔细查看结论:
Conclusions Complex solution to problem for which simple solutions are widely used and will be improved by C++0x leaving us little need. We have little to no experience with the recommended language features which are to be standardized. Fixing bad software complex system will never work. Recommend minor language changes to improve future GC support - disallow hiding of pointers (xor list trick) as one example. Finally - address the "C++ is bad because it has no GC" argument head-on. C++ doesn't generate garbage and so has no need for GC. Clearly Java, C#, Objective C, etc. generate lots of garbage.
是的,最后一句话是主观的,也是圣战的一部分。
我使用C ++是因为我不喜欢有人需要为我清除垃圾的想法。
市政厅做到了,对我来说就足够了。
如果需要GC,请使用其他语言。为正确的工作选择正确的工具。
回答
我经常使用boehm-gc。使用起来很简单,但是文档确实很差。有一个C ++页面,但是很难找到。
基本上,我们只需确保每个类都从其基类继承,并且始终将gc_allocator传递给容器。在许多情况下,我们想使用libgccpp来捕获new和delete的其他用途。这些主要是高层更改,我们发现可以在编译时使用#ifdef关闭GC,支持该更改仅会影响一个或者两个文件。
我的主要问题是,除非我们先关闭收集器,否则我们将无法再使用Valgrind。关闭收集器很容易做到,并且不需要重新编译,但是,如果开始耗尽内存,显然不可能使用它。