第三方垃圾收集器中使用的方法

时间:2010-02-24 04:04:13

标签: c++ garbage-collection history theory

我写信是为了澄清本网站上的一些评论。

1)我知道C ++没有垃圾收集器。有人说C ++是在垃圾收集器的概念之前发明的,所以这就是原因。真的吗?我认为这是有道理的。

2)每当讨论垃圾收集器时,智能点(例如boost :: share_ptr)就会成为一种方式。我曾经确信引用计数是实现垃圾收集器的一种方法,但有些人说,智能点不是垃圾收集器的实现。情况怎样?

3)有些人说为什么垃圾收集器不包含在C ++中是因为它很难并且很多问题都无法解决。然而,有人说有第三方垃圾收集器可用,无论是商业还是免费。那么这些第三方如何处理这些问题呢?

如果有人能澄清我的困惑,我感激不尽。

非常感谢!

5 个答案:

答案 0 :(得分:4)

  1. 不,垃圾收集比C ++早得多(许多Lisp版本在60年代都有它)。

  2. 引用计数是一种实现垃圾收集的方法,但它的性能非常差(新的Unladen Swallow项目,用于加速CPython解释器,包括从引用计数转移到更好的垃圾收集实现 - 实质性提升)。

  3. C和C ++的Boehm收集器使用保守的方法:简而言之,任何看起来像地址的东西都被认为是一个(所以无论它可能“指向什么” “没有收集)。阅读我给出的URL及其外发链接页面,了解有关该主题的更多信息。

答案 1 :(得分:3)

  1. 正如Alex指出的那样,LISP在C ++发明之前就已经进行了垃圾收集。 OTOH,其中一些早期的实现使用了引用计数。

  2. 大多数讨论垃圾收集的人都在想一些隐藏的东西。引用计数确实存在许多问题。它可以有性能问题,但由于对象通常在C ++中使用,很少有。更大的问题是引用计数通常不能很好地处理数据中的循环。对于一个简单的例子,请考虑:

    struct node {     节点*下一个; };

    node * node1 = new node,node2 = new node;

    node1-> next = node2; node2-> next = node1;

    由于每个节点现在引用另一个节点,因此它们的引用计数将保持非零,即使其他任何节点都没有引用。它们即使在无法访问之后也不会被收集。然而,这个问题是可以克服的。

  3. 当您使用带有C ++的第三方垃圾收集器时,结果不再是(完全)符合C ++的实现。例如,如果您“调动”指针(例如,反转其所有位),GC将无法识别它指向的位置。当你“不再调侃”它(翻回位)时,它指向的东西可能不再存在。然而,实际代码中的问题非常不寻常,人们经常使用GC而没有任何问题。

    OTOH,也有局限性,因此C和C ++的大多数垃圾收集器也不能很好地工作。最近的GC设计通过复制仍然存在的对象来工作,因此在GC循环发生后它们在堆中都是连续的。为此,它必须“修复”指向该对象的所有指针以指向新地址。由于使用C或C ++的GC不确定指针是什么,它不能修改内容(如果某些东西不是指针),所以它必须保留对象,这会损害性能。

  4. 有关将GC添加到C ++的一些认真讨论。 Two comp.lang.c ++。版主threads可能很有趣。警告:它们很长,有些参数会在少数情况下重复几次。 OTOH,他们确实指出了一些真正的问题和可能的解决方案。

答案 2 :(得分:1)

关于1和较小程度2:

这是一个简明扼要的解释。

http://www.devx.com/tips/Tip/12766

另外,这里有关于该主题的类似问题。

Why doesn't C++ have a garbage collector?

检查出来。

答案 3 :(得分:0)

根据http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29垃圾收集是在1959年发明的,它大大早于C ++。

C ++不包含垃圾收集器的原因是因为您,程序员,管理内存,从C继承的功能。垃圾收集器是为您完成内存管理的语言的一部分。您可以实现一个,但您必须使用您的实现来管理所有内存访问 - 否则,您将绕过它。简而言之,GC是您(使用您所使用的任何语言)与系统底层内存之间的层的一部分。

答案 4 :(得分:0)

对垃圾收集的最小支持 - 但没有垃圾收集器 - 将被添加到下一个C ++标准(非正式地称为C ++ 0x)。这是一篇关于它的好文章:http://www.hpl.hp.com/techreports/2009/HPL-2009-360.pdf