第二章
空間配置
器(allocator)
空間配置器按我的理解就
是c++ stl
進行記憶體管理的元件(包括記憶體的申請和釋放);當然,不只是記憶體,還可以向硬碟申請空間;
我主要看了記憶體的配置與釋放(這裡「配置」就應該是「申請」的意思)。
stl對此設計的哲學主要包括以下四個方面:
1、向系統堆空間申請記憶體空間
2、考慮了多執行緒的情況下的申請;
3、考慮記憶體不足的應變措施;
4、考慮過多「小型區塊」的記憶體碎片的問題;
c++
申請的基本動作是
::operator new(),
釋放記憶體的基本動作是
::operator delete()
。而且,
stl中的
new和
delete
這兩個運算子相當於
malloc()
和free()
函式完成記憶體的申請和釋放;(
闡述了c++ new
的實現,其實用的就是
malloc函式)
stl設計了雙層級的配置器:
1.第一級配置器:直接
使用malloc
和new();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
的時候,則以記憶體池管理;
記憶體池管理策略:主動將任何小額區域塊得記憶體需求量上調至
8的倍數,各自管理
8,16,24,32
,……128bytes
共計16
個free lists.free lists
的區域節點結構如下:
union
至於採用聯合體而不是結構體的原因是減小系統負擔。(具體的原因沒有看懂)
STL原始碼剖析 讀書筆記(1)
stl即c 標準模板庫,主要由六大部件組成,分別是 分配器 容器 迭代器 演算法 仿函式 介面卡。在講述這些主要部件之前,先來了解一下物件導向程式設計和泛型程式設計,物件導向程式設計 object oriented programming,簡稱oop 企圖將資料和處理資料的方法放到一起,例如,在c ...
STL原始碼剖析讀書筆記
一.stl提供六大元件,彼此可以組合套用。1.容器 containers 各種儲存結構,如vector list deque set map,用來存放資料。2.演算法 algorithme 各種常用演算法,如sort search copy erase等。3.迭代器 iterators 扮演容器與演...
《STL原始碼剖析》筆記 1
第一章 stl概論與版本簡介 一 臨時物件的產生與運用。p36 這裡的臨時物件,指的是一種無名物件 unnamed subjects 如果它們的產生不在程式設計師的預料之下,往往造成效率的負擔,但有時刻意製造臨時物件會讓程式乾淨清爽。刻意製造臨時物件的方法是,在型別名稱後直接加一對小括號,並可指定初...