c stl記憶體分配

2021-08-15 02:44:06 字數 1489 閱讀 6606

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新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...