STL源碼剖析——空間配置器和迭代器

特此申明:

前段時間找工作所以看了《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共計16free lists

迭代器和traits編程技法

         迭代器模式:提供一種方法,使之能夠依序尋訪某個聚合物所含的各個元素,而又無需暴露該聚合物的內部表述方式。

         迭代器設計思維——STL關鍵所在。其中心思想:將數據容器和算法分開,彼此獨立設計,最後再以一貼膠着劑將它們粘合一起。迭代器是一種行爲類似指針的對象,最重要的是內容提領和成員訪問,所以編程工作就是對operator*he operator->進行重載。指針後跟的角括號放的是“原生指針所指對象”的類型,而不是指針的類型。

         迭代器的相應型別使用functiontemplate的參數推到機制解決。迭代器相應型別不只是迭代器所指對象的型別一種,最常用的相應型別有五種,並非任何情況下任何一種都可以利用template參數推到機制來取得。

         Traits編程技法——STL源代碼門鑰(這部分還沒有仔細看,所以以後有時間再更新)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章