1. 空間配置器:內存池實現小塊內存分配,對應到設計模式--單例模式(工具類,提供服務,一個程序只須要一個空間配置器便可),享元模式(小塊內存統一由內存池進行管理)算法
2.迭代器:迭代器模式,模板方法編程
3.容器:STL的核心之一,其餘組件圍繞容器進行工做:迭代器提供訪問方式,空間配置器提供容器內存分配,算法對容器中數據進行處理,仿函數僞算法提供具體的策略,類型萃取 實現對自定義類型內部類型提取。保證算法覆蓋性。其中涉及到的設計模式:組合模式(樹形結構),門面模式(外部接口提供),適配器模式(stack,queue經過deque適配得 到),建造者模式(不一樣類型樹的創建過程)。設計模式
4.類型萃取:基於範型編程的內部類型解析,經過typename獲取。能夠獲取迭代器內部類型value_type,Poter,Reference等。ide
5.仿函數:一種相似於函數指針的可回調機制,用於算法中的決策處理。涉及:策略模式,模板方法。函數
6適配器:STL中的stack,queue經過雙端隊列deque適配實現,map,set經過RB-Tree適配實現。涉及適配器模式。工具
關於六大組件之間的具體關係如圖簡單描述性能
ps(圖技術比較水,見諒,若有bug,請指正)spa
貌似扯的多了,來談談主題《空間配置器》問題吧。設計
STL空間配置器產生的原因:指針
在軟件開發,程序設計中,咱們難免由於程序需求,使用不少的小塊內存(基本類型以及小內存的自定義類型)。在程序中動態申請,釋放。
這個過程過程並非必定可以控制好的,因而乎,
問題1:就出現了內存碎片問題。(ps外碎片問題)
問題2:一直在由於小塊內存而進行內存申請,調用malloc,系統調用產生性能問題。
注:內碎片:由於內存對齊/訪問效率(CPU取址次數)而產生 如 用戶須要3字節,實際獲得4或者8字節的問題,其中的碎片是浪費掉的。
外碎片:系統中內存總量足夠,可是不連續,因此沒法分配給用戶使用而產生的浪費。下邊簡單圖解
這兩個問題解釋清楚以後,就來談STL空間配置器的實現細節了
實現策略
用戶申請空間大於128?
yes:調用一級空間配置器
no:調用二級空間配置器
大體實現爲:
二級空間配置由內存池以及夥伴系統:自由鏈表組成
一級空間配置器直接封裝malloc,free進行處理,增長了C++中的set_handler機制(這裏其實也就是個略顯牽強的裝飾/適配模式了),增長內存分配時客戶端可選處理機制。
可配置性:
客戶端能夠經過宏__USE_MALLOC進行自定義選擇是否使用二級空間配置器。
一級空間配置器就主要封裝malloc,添加handler機制了,這裏就不羅嗦了,相信各位都是能夠經過源碼瞭解到的