Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 第三方垃圾收集器中使用的方法_C++_Garbage Collection_History_Theory - Fatal编程技术网

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

C++ 第三方垃圾收集器中使用的方法,c++,garbage-collection,history,theory,C++,Garbage Collection,History,Theory,我写信是为了澄清一些关于这个网站的评论 1)我知道C++没有垃圾回收器。有人说C++是在垃圾回收器的发明之前发明的,所以这就是原因。这是真的吗?我认为这是有道理的 2) 每当讨论垃圾收集器时,smart point(如boost::share_ptr)就是一种方式。我曾经确信引用计数是实现垃圾收集器的一种方法,但有人说,smart point不是垃圾收集器的实现。怎么回事 (3)有人说垃圾回收器为什么不包含在C++中,因为它很难,很多问题都无法解决。然而,有人说有第三方垃圾收集器可用,无论是商

我写信是为了澄清一些关于这个网站的评论

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

2) 每当讨论垃圾收集器时,smart point(如boost::share_ptr)就是一种方式。我曾经确信引用计数是实现垃圾收集器的一种方法,但有人说,smart point不是垃圾收集器的实现。怎么回事

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

如果有人能澄清我的困惑,我将不胜感激


非常感谢

关于1和较小程度的2:

这是一个简洁但很好的解释

另外,关于这个话题,这里也有类似的问题

看看他们

不,垃圾收集比C++更古老(特别是60年代的许多LISP版本)。

  • 引用计数是实现垃圾收集的一种方法,但它的性能非常差(新的unladenswallow项目,用于加速CPython解释器,包括从引用计数转移到更好的垃圾收集实现,这是一个巨大的性能提升)

  • < C > C++的收集器使用保守的方法:简单地说,看起来像地址的任何东西都是一个(因此不管它指向什么,都没有被收集)。阅读我给出的URL页面,以及它的外发链接,了解更多关于这个主题的信息

    《垃圾收集》是在1959发明的,它将大大提前C++(

    )。
    < C++不包含垃圾收集器的原因是因为你,程序员,管理内存,一个从C继承的特征。垃圾回收器是一种语言,它为你完成内存管理。您可以实现一个,但必须使用您的实现来管理所有的内存访问—否则,您将绕过它。总之,GC是你(在你所使用的语言中)和系统底层内存的一部分。

    < P>垃圾收集的最小支持——但没有垃圾收集器——将被添加到下一个C++标准(非正式地称为C++ 0x)。这里有一篇关于它的好文章:

    正如亚历克斯指出的,LISP自C++发明之前就已经进行了垃圾收集。OTOH,一些早期的实现使用了引用计数

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

    结构节点{ 节点*下一步; };

    node*node1=新节点,node2=新节点

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

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

  • >P>当你使用C++的第三方垃圾收集器时,结果不再是(相当)一个符合C++的一致性实现。例如,如果你“旋转”一个指针(例如反转它的所有位),GC将无法识别它指向的是什么。当你“解刷”它时(将碎片向后拍打),它指向的东西可能不再存在。然而,实际代码中的问题是非常不寻常的,以至于人们经常使用GC而没有任何问题

    OTHH,也有局限性,所以大多数C和C++垃圾收集器也不是很好。最新的GC设计通过复制仍然存在的对象来工作,这样在GC循环发生后,它们在堆中都是连续的。为此,它必须“修复”指向该对象的所有指针,以指向新地址。由于C或C++的GC不知道指针是什么,所以它不能修改事物(如果不是指针),那么它必须将对象放在适当的位置,这会影响性能。


    对C++中添加GC的问题进行了一些认真的讨论。Calp.Lang.c++。慢化可能很有趣。警告:它们相当长,一些论点会重复,在少数情况下会重复多次。OTOH,他们确实指出了一些实际问题和可能的解决方案。

    关于“哪种语言首先具有X功能”的唯一答案是Lisp、Smalltalk。@Jimmy,还有其他的,例如--“第一种语言具有代数表达式语法”,Fortran;“具有块结构和词汇范围的第一语言”,Algol(Scheme从Algol复制而来,其他LISP从Scheme复制而来);“有自己专门字符集的第一语言”,APL;…;-)非常感谢!非常感谢您的评论。