C++ 编程/编译器/链接器/库/垃圾回收
外观
垃圾回收是一种自动内存管理的形式。垃圾回收器试图回收垃圾,或者说由应用程序不再访问或修改的对象使用的内存。
跟踪垃圾回收器需要一些隐式的运行时开销,这些开销可能超出了程序员的控制范围,有时会导致性能问题。例如,常用的 Stop-The-World 垃圾回收器会在任意时间暂停程序执行,这可能会使垃圾回收语言不适合某些嵌入式系统、高性能服务器软件以及具有实时需求的应用程序。
一个更根本的问题是,垃圾回收器会违反引用局部性,因为它们故意努力寻找最近未访问的内存块。现代计算机体系结构的性能越来越依赖于缓存,而缓存的有效性取决于引用局部性的假设。一些垃圾回收方法比其他方法具有更好的引用局部性。分代垃圾回收对缓存比较友好,复制收集器会自动对内存进行碎片整理,从而有助于将相关数据放在一起。然而,垃圾回收周期的时机不佳可能会对某些计算产生严重的影响,出于这个原因,许多运行时系统提供机制,允许程序暂时挂起、延迟或激活垃圾回收周期。
尽管存在这些问题,但对于许多实际目的来说,用现代垃圾回收语言实现的分配/释放密集型算法实际上可能比使用显式内存管理的等效算法更快(至少在没有专家程序员的英雄式优化的情况下)。造成这种情况的一个主要原因是,垃圾回收器允许运行时系统以可能有利的方式摊销分配和释放操作。例如,考虑以下 C++ 程序
#include <iostream>
class A {
int x;
public:
A() { x = 0; ++x; }
};
int main() {
for (int i = 0; i < 1000000000; ++i) {
A *a = new A();
delete a;
}
std::cout << "DING!" << std::endl;
}
提供此功能的最广泛使用的库之一是 Hans Boehm 的保守 GC。Oilpan 是一个为 C++ 设计的垃圾回收器,最初是为 Blink 设计的。如前所述,C++ 还支持一个称为 RAII(资源获取即初始化) 的强大习惯用法,它可以用于安全地自动管理包括内存在内的资源。