跳轉到內容

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(資源獲取即初始化) 的強大習慣用法,它可以用於安全地自動管理包括記憶體在內的資源。


Clipboard

待辦事項
在庫中新增一些示例,並進一步擴充套件此資訊

華夏公益教科書