首先,我提出这个问题并不是因为垃圾回收的优点。我提问的主要原因是我知道Bjarne Stroustrup曾经说过C++在某个时间点会有一个垃圾回收器。
话虽如此,为什么还没有添加呢?已经有一些用于C++的垃圾回收器了。这只是那种“说起来容易做起来难”的事情吗?或者还有其他原因(并且在C++11中不会被添加)?
跨链接:
仅仅为了澄清一下,我理解C++在创立时没有垃圾回收器的原因。我想知道的是为什么不能添加回收器。
首先,我提出这个问题并不是因为垃圾回收的优点。我提问的主要原因是我知道Bjarne Stroustrup曾经说过C++在某个时间点会有一个垃圾回收器。
话虽如此,为什么还没有添加呢?已经有一些用于C++的垃圾回收器了。这只是那种“说起来容易做起来难”的事情吗?或者还有其他原因(并且在C++11中不会被添加)?
跨链接:
仅仅为了澄清一下,我理解C++在创立时没有垃圾回收器的原因。我想知道的是为什么不能添加回收器。
简短回答:
我们不知道如何高效地(带有最小的时间和空间开销)并且在所有可能的情况下正确地进行垃圾回收。
详细回答:
与C语言一样,C++是一种系统语言;这意味着当您编写系统代码时,例如操作系统时使用它。换句话说,C++的设计与C一样,以最佳性能为主要目标。该语言的标准不会添加任何可能会妨碍性能目标的功能。
这引出了一个问题:为什么垃圾回收会妨碍性能?主要原因是,在实现方面,我们(计算机科学家)不知道如何在所有情况下都以最小的开销进行垃圾回收。因此,C++编译器和运行时系统无法始终高效地执行垃圾回收。另一方面,C++程序员应该了解自己的设计/实现,并且他是最适合决定如何最好地进行垃圾回收的人。
最后,如果控制(硬件、细节等)和性能(时间、空间、功率等)不是主要约束条件,则C++不是正确的工具。其他语言可能更好地服务并提供更多(隐藏的)运行时管理,具有必要的开销。
主要有两个原因:
C++ 已经提供了手动内存管理、堆栈分配、RAII、容器、自动指针、智能指针等等。这应该足够了。垃圾回收器是为懒惰的程序员准备的,他们不想花费 5 分钟思考谁应该拥有哪些对象或者资源何时应该被释放。这不是我们在 C++ 中做事情的方式。
实施垃圾回收确实是从低级到高级范式的转变。
如果您查看具有垃圾回收功能语言中字符串的处理方式,您会发现它们仅允许高级字符串操作函数,并且不允许对二进制字符串进行访问。简单地说,所有字符串函数都会首先检查指针以查找字符串所在的位置,即使您只是取出一个字节。因此,如果您在具有垃圾回收功能的语言中执行处理字符串中每个字节的循环,它必须为每次迭代计算基本位置加偏移量,因为它无法知道字符串何时移动。然后您还需要考虑堆、栈、线程等等。