垃圾收集
D 是一种全面采用垃圾收集的语言。这意味着它从来不用释放内存。只需要按需分配,然后由垃圾收集程序周期性的将所有未使用的内存返回给可用内存池。C 和 C++ 程序员习惯于显式的管理内存分配和释放,很可能会怀疑垃圾收集的好处和功效。对一开始就采用垃圾收集设计的新项目和用垃圾收集改良的现有项目的经验表明:
- 采用垃圾收集的程序更快。这有些违反直觉,但是其原理有:
- 引用计数是解决显式内存分配问题的常用解决方案。实现赋值时递增和递减操作的代码通常是程序缓慢的原因之一。将其隐藏在智能指针类之后并不能提高速度。 (无论如何,引用计数也不是全面的解决方案,因为循环引用从不会被删除。)
- 析构函数用来释放对象获得的资源。对于大多数类来说,这个资源就是内存。采用垃圾收集,大多数析构函数都可以完全抛弃。
- 当对象在堆栈上分配时,那些负责释放内存的析构函数就变得十分重要。对于这些函数来说,必须确立一种机制以使异常发生时,每一个函数帧中的析构函数都会被调用以释放对象持有的内存。如果析构函数变得不相关,就没有设置特殊的堆栈帧用于处理异常,这样运行也会更快。
- 内存管理代码总量会变少。程序越大,它在cache中的部分的越少;它的调页越多,它运行的越慢。
- 垃圾收集只会在内存变得紧张时才会运行。当内存尚且宽裕时,程序将全速运行,不会在释放内存上花费任何时间。
- 相对于过去的缓慢的垃圾收集程序,现代的垃圾收集程序要先进得多。分代,复制收集程序在很大程度上克服了早期的标记&清除算法的低效。
- 现代垃圾收集程序进行堆紧缩。堆紧缩将减少程序引用的页的数量,这意味着内存访问命中率将更高,交换将更少。
- 采用垃圾收集的程序不会因为内存泄漏的累积而崩溃。
- 垃圾收集程序回收不被使用的内存,因此不会有“内存泄露”问题。内存泄露会使长期运行的应用程序逐渐耗尽内存直至使系统崩溃。采用 GC 的程序拥有更长期的稳定性。
- 采用垃圾收集的程序 有更少