特此申明:
前段時間找工作所以看了《STL源碼剖析》,整理的時候除了參考網上已有的筆記貼,加上自己整合的,可能和別人有雷同之處。不過無所謂啦,寫出來自己看看,需要的朋友參考下,僅此而已。
空間配置器
空間配置器其實就是C++ STL進行內存管理的組件(包括內存的申請和釋放);當然,不只是內存,還可以向硬盤申請空間。爲了精密分工,內存配置::operator new() 時先分配內存,再構造函數;釋放行爲::operator delete() 則是先析構對象再釋放內存。
對於內存的配置與釋放,STL對此設計的哲學主要包括以下四個方面:
1、向系統堆空間申請內存空間
2、考慮了多線程的情況下的申請;
3、考慮內存不足的應變措施;
4、考慮過多“小型區塊”的內存碎片的問題;
考慮到小型區塊造成的內存破碎問題,SGO設計了雙層配置器:
1. 第一級配置器:直接使用malloc和free();
2. 當配置區域超過128bytes的時候,則使用第一級配置器;當配置區域小於128bytes的時候,採用了負責的“內存池”的整理方式。
第一級配置器以malloc(),free(),realloc()等C函數執行實際的內存配置、釋放、重配置操作,並實現類似C ++ new handler的機制。所謂C++ new handler機制,你可以要求系統在內存配置需求無法被滿足的時候,調用一個你指定的函數。
SGI第一級配置器的allocate()和relloc()函數都是在調用malloc()和realloc()函數不成功後,調用oom_malloc()和oom_relloc()函數,後兩者都有內循環,不斷調用“內存處理不足處理例程”,期望在某次調用之後,獲得足夠的內存而完成任務。但是如果“內存處理不足處理例程”並未被客端設定,oom_malloc()和oom_relloc()函數就拋出bad_alloc異常,或者用exit(1)終止程序。
小額區塊帶來的其實不僅是內存碎片,配置時的額外負擔也是一個大問題。所以SGI第二級配置器的配置策略:如果區域足夠大,大於128Bytes,就移交給第一級配置器處理;當區域小於128Bytes的時候,則以內存池管理,此方法是:每次配置一大塊內存,並維護對應之自由鏈表,有需求時直接從free-lists分配和回收,同時任何小額區塊的內存需求量上調至8的倍數,各自管理8,16,24,32,……128Bytes共計16個free lists。
迭代器和traits編程技法
迭代器模式:提供一種方法,使之能夠依序尋訪某個聚合物所含的各個元素,而又無需暴露該聚合物的內部表述方式。
迭代器設計思維——STL關鍵所在。其中心思想:將數據容器和算法分開,彼此獨立設計,最後再以一貼膠着劑將它們粘合一起。迭代器是一種行爲類似指針的對象,最重要的是內容提領和成員訪問,所以編程工作就是對operator*he operator->進行重載。指針後跟的角括號放的是“原生指針所指對象”的類型,而不是指針的類型。
迭代器的相應型別使用functiontemplate的參數推到機制解決。迭代器相應型別不只是迭代器所指對象的型別一種,最常用的相應型別有五種,並非任何情況下任何一種都可以利用template參數推到機制來取得。
Traits編程技法——STL源代碼門鑰(這部分還沒有仔細看,所以以後有時間再更新)。