为什么 C 没有垃圾收集器?

新手上路,请多包涵

我之所以问这个问题,首先是因为垃圾收集的优点。我问这个的主要原因是我知道 Bjarne Stroustrup 说过 C++ 将在某个时间点有一个垃圾收集器。

说了这么多,怎么还没加呢?已经有一些用于 C++ 的垃圾收集器。这只是那些“说起来容易做起来难”的事情之一吗?还是有其他原因没有添加(并且不会在 C++11 中添加)?

交叉链接:

澄清一下,我理解 C++ 在首次创建时没有垃圾收集器的原因。我想知道为什么无法添加收集器。

原文由 Jason Baker 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 587
2 个回答

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

Bjarne Stroustrup 本人的一句话:

我曾希望可以选择启用的垃圾收集器将成为 C++0x 的一部分,但是有足够的技术问题我必须解决这个收集器如何与语言的其余部分集成的详细规范,如果提供。与基本上所有 C++0x 功能的情况一样,存在实验性实现。

有一个很好的讨论主题 here

总体概述:

C++ 非常强大,几乎可以让你做任何事情。出于这个原因,它不会自动将许多可能影响性能的东西推给您。垃圾收集可以很容易地用智能指针(用引用计数包装指针的对象,当引用计数达到 0 时自动删除自己)实现。

C++ 在构建时考虑了没有垃圾收集的竞争对手。与 C 和其他语言相比,效率是 C++ 必须抵御批评的主要问题。

有两种类型的垃圾收集…

显式垃圾收集:

C++0x 通过 shared_ptr 创建的指针进行垃圾收集

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

对于 C++0x 之前的版本, boost:shared_ptr 存在并用于相同目的。

隐式垃圾回收:

虽然它没有透明的垃圾收集。不过,它将成为未来 C++ 规范的焦点。

为什么 Tr1 没有隐式垃圾回收?

C++0x 的 tr1 应该有很多东西,Bjarne Stroustrup 在之前的采访中表示 tr1 没有他想要的那么多。

原文由 Brian R. Bondy 发布,翻译遵循 CC BY-SA 4.0 许可协议

实施垃圾收集实际上是从低级到高级的范式转变。

如果您查看带有垃圾收集的语言中处理字符串的方式,您会发现它们只允许高级字符串操作函数并且不允许对字符串进行二进制访问。简而言之,所有字符串函数首先检查指针以查看字符串的位置,即使您只是绘制一个字节。因此,如果您正在执行一个循环来处理带有垃圾收集的语言中的字符串中的每个字节,它必须计算每次迭代的基本位置和偏移量,因为它不知道字符串何时移动。然后你必须考虑堆、堆栈、线程等。

原文由 www-0av-Com 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题