sgi stl中stl 的記憶體分配不是採用allocator類,而是採用自己寫的類alloc
這個alloc類中主要有四個函式
construct: 用於呼叫新建類的建構函式,其實現就是依靠placement new
destroy: 用於呼叫新建類的析構函式
allocate: 用於分配新建類的記憶體,用operator new ,或者malloc
deallocate
new關鍵字就是先分配記憶體,再呼叫類的建構函式,而alloc類更加細分,把這兩部分分來,拆為allocate + construct
其實allocate()函式完全可以用operator new,或者malloc去實現,但是為了減少記憶體碎片,sgi stl採用了記憶體池去實現。
scg stl採用兩級配置器,這種方法稱為雙層級配置器。其實就是兩種方法。
第一級,即第一種方法,直接採用malloc()和free()。
第二級,即第二種方法,如果分配的區域大於128bytes,直接採用malloc,如果小於128 bytes 就是用記憶體池分配,以減少碎片。
第二級方法示意圖如下:
使用自由鍊錶(free-list)技巧。主動將不論什麼小額區塊的記憶體需求量上調至8的倍數。如需求30,則上調至32。
free-list節點結構
union obj
; 有16個free-lists。各自管理大小分別為8、16、24、32、40、48、56、64、72、80、88、96、104、112、120、128 bytes的小額區塊。
申請流程例如以下。
釋放流程例如以下。
而allocator類中是通過allocate函式來實現分配記憶體的,而allocate函式實現如下:
所以,stl已經拋棄了複雜的記憶體池方法,而改用簡單的new 方法實現stl 記憶體分配了。
C STL中的vector的記憶體分配與釋放
1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...
C STL中的vector的記憶體分配與釋放
1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...
C STL中的vector的記憶體分配與釋放
1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...