C++ 为什么';tc++;你有垃圾收集器吗?

C++ 为什么';tc++;你有垃圾收集器吗?,c++,garbage-collection,c++11,C++,Garbage Collection,C++11,我问这个问题不是因为垃圾收集的优点。我之所以要问这个问题是因为我知道Bjarne Stroustrup说过C++会在某个时间点有一个垃圾回收器。 既然如此,为什么还没有添加呢?已经有一些C++的垃圾收集器。这只是“说起来容易做起来难”类型的事情之一吗?或者还有其他原因没有添加它(并且不会在C++11中添加) 交叉链接: 只是澄清,我理解C++最初创建时没有垃圾回收器的原因。我想知道为什么不能添加收集器。什么类型?是否应针对嵌入式洗衣机控制器、手机、工作站或超级计算机进行优化? 它应该优先考

我问这个问题不是因为垃圾收集的优点。我之所以要问这个问题是因为我知道Bjarne Stroustrup说过C++会在某个时间点有一个垃圾回收器。 既然如此,为什么还没有添加呢?已经有一些C++的垃圾收集器。这只是“说起来容易做起来难”类型的事情之一吗?或者还有其他原因没有添加它(并且不会在C++11中添加)

交叉链接:


只是澄清,我理解C++最初创建时没有垃圾回收器的原因。我想知道为什么不能添加收集器。

什么类型?是否应针对嵌入式洗衣机控制器、手机、工作站或超级计算机进行优化?
它应该优先考虑gui响应还是服务器加载?
它应该使用大量内存还是CPU

C/C++用于太多不同的环境。 我怀疑像boost智能指针这样的东西对大多数用户来说就足够了

编辑-自动垃圾收集器与其说是性能问题(您可以购买更多服务器),不如说是可预测性能的问题。

不知道GC什么时候开始工作就像雇佣了一个嗜睡症飞行员,大多数时候他们都很棒——但是当你真的需要反应的时候

可以添加隐式垃圾收集,但它没有成功。这可能不仅仅是因为执行复杂,还因为人们不能足够快地达成普遍共识

比亚恩·斯特罗斯托普自己的一句话:

我曾希望一个垃圾收集者 可以选择性地启用 将是C++0x的一部分,但是 我有足够的技术问题 凑合 说明这种收集器是如何工作的 与系统的其余部分集成 语言,如有提供。事实如此 基本上所有的C++0x特性, 存在一个实验实现

对这个话题进行了很好的讨论

概述:

C++非常强大,几乎可以让你做任何事情。因此,它不会自动将许多可能影响性能的事情推到您身上。垃圾收集可以通过智能指针(使用引用计数包装指针的对象,当引用计数达到0时自动删除自己)轻松实现

C++构建时考虑到了没有垃圾收集的竞争对手。效率是C++与其他语言相比必须避免批评的主要原因。p> 有两种类型的垃圾收集

显式垃圾收集:

C++0x将通过使用共享\u ptr创建的指针进行垃圾收集

如果你想要它,你可以使用它,如果你不想要它,你不会被迫使用它

如果您不想等待C++0x,那么当前也可以使用boost:shared_ptr

隐式垃圾收集:

但它没有透明的垃圾收集。这将是未来C++规范的一个重点。 为什么Tr1没有隐式垃圾收集?


C++0x的tr1应该拥有很多东西,Bjarne Stroustrup在之前的采访中表示,tr1没有他想要的那么多 没有什么可以阻止您使用某种形式的绑定到第三方垃圾收集机制的智能指针。我似乎记得微软在COM上做过类似的事情,但进展并不顺利

如果你想要自动垃圾收集,有好的商业模式 以及C++领域的公共垃圾收集器。适用于以下情况的应用程序: 垃圾回收是合适的,C++是一个优秀的垃圾收集
与其他语言相比,语言的性能更优越 收集语言。参见C++中自动垃圾收集的讨论。 另见Hans-J.Boehm的()

C++支持支持内存的编程技术 管理层将继续努力。我认为垃圾收集是资源管理的最后选择和不完美的处理方式。这并不意味着它永远不会有用,只是在许多情况下有更好的方法

资料来源:

至于为什么它没有内置,如果我没记错的话,它是在GC出现之前发明的,我不相信这种语言会有GC,原因有几个(即与C的向后兼容性)


<>希望这有帮助。

< p>回答C++中的大多数“为什么”问题,读

C++中没有建立在垃圾收集中的一个最大的原因是让垃圾收集对析构函数发挥好是非常困难的。据我所知,还没有人真正知道如何彻底解决这个问题。有很多问题需要处理:

  • 对象的确定性生命周期(引用计数提供了这一点,但GC没有。尽管这可能没什么大不了的)
  • 当对象被垃圾收集时,如果析构函数抛出会发生什么?大多数语言忽略这个异常,因为实际上没有catch块能够将其传输到,但是这可能不是C++可接受的解决方案。
  • 如何启用/禁用它?当然,这可能是编译时的决定,但为GC编写的代码与为非GC编写的代码将非常不同,并且可能不兼容。你如何协调这一点
这些只是其中的一小部分
void f(int n, int x) {
    Gadget *p = new Gadget{n};
    if(x<100) throw SomeException{};
    if(x<200) return;
    delete p;
}
void f(int n, int x) {
    Gadget p = {n};  // Just leave it on the stack (where it belongs!)
    if(x<100) throw SomeException{};
    if(x<200) return;
}