STL庫的記憶體配置器(allocator)

2022-07-11 08:06:11 字數 2189 閱讀 9251

正在學習中,如果有錯,還請多多指教,根據不斷的理解,會進行更改,更改之前的樣子都會保留下來,記錄錯誤是最大的進步,嗯嗯!

具有次配置力的sgi空間配置器(sgi是stl的一種版本,也有其他的版本)

這裡我就不貼出來具體成員和介面的實現了,網上可以搜到stl的原始碼

c++中,new乙個變數可以分為兩個階段,1.分配空間 2.呼叫建構函式;delete變數也分為兩個步驟,1.呼叫析構函式 2.釋放空間

sgi的alloc將這兩部分分開,讓空間的分配釋放和構造析構由不同的函式呼叫,區分他們的操作

空間的分配和釋放由alloc::alloclate()  alloc::dealloclate()實現 構造和析構由alloc::construct() alloc::destory()函式負責,他們在標頭檔案

1 #include//

負責記憶體空間的配置和釋放

2 #include//

負責物件內容的構造和析構

這兩個標頭檔案都包含在#include當中

先講一下析構和構造的大概思路  

下面講一下我對空間的配置與釋放的理解

下面就比較重要了,sgi空間配置器採用了兩級配置器,分為第一級配置器和第二級配置器,第一級配置器就是拿malloc()實現的,第二級配置器採用了記憶體池的概念;

先來講第一級配置器,第一級配置器的實現就是用的malloc()(因為很重要所以多說幾遍),它會不斷地嘗試開闢記憶體,如果沒有記憶體可供開闢,就會嘗試釋放空間,然後再取嘗試開闢空間,第一級配置器比較重要的一點就是實現了類似c++中new-handler機制,用來處理記憶體不足的情況

記憶體池是使用鍊錶結構實現的(個人感覺和雜湊桶的方法類似),而不採用順序表,這樣就可以更好的解決記憶體碎片的問題了。

注意,這裡的freelists是鍊錶!

注意!這裡之前寫的不太清楚,freelists是乙個順序表,每乙個單元下邊都連線這乙個鍊錶,當區塊被客端(client)使用就會像上圖一樣將區塊呼出去,然後改變指標指向下乙個節點(就是採用頭刪)

每個鍊錶節點所管理的區塊大小也是不一樣的,第乙個節點管理8bytes,第二個16bytes。。。以此類推,最後乙個節點管理128bytes,所以當超過128位元組第二級配置器無法處理,就只好呼叫第一級配置器(記憶體不足時也會呼叫第一級配置器,因為第一級配置器裡面有記憶體不足處理例程)

下面給出鍊錶節點的實現

1

union obj

2;

裡面的聯合體指標就是指向下乙個節點的指標,那個char是指向實際記憶體塊的指標,採用聯合體可以減少記憶體的消耗,不必專門維護乙個指向下乙個節點的指標

當節點所指的記憶體塊是空閒塊時,obj被看做乙個指標,指向下乙個節點,當節點已經被分配了記憶體之後,被視為乙個指標,指向實際區塊

當分配函式allocate()(alloc中申請記憶體的函式)發現沒有可用的區塊之後,就會去記憶體池中申請新的區塊(呼叫chunk_alloc()函式) ,預設申請20個區塊,當記憶體池的可用記憶體不足20個區塊,有多少給多少,如果連乙個區塊的記憶體都不夠,就往記憶體池中注入記憶體(就是再去開闢一些放進記憶體池裡),就會去free_lists中遍歷,尋找記憶體池分配給自由鍊錶但是卻處於空閒狀態的節點,將這些節點的儲存空間歸還個記憶體池,再遞迴去使用chunk_alloc()函式判斷是否空間夠分配;如果很不幸,還是不夠用,那麼注意!!會將記憶體池中剩餘的小空間分配成低位區塊分給自由鍊錶(就是說假如需要申請16個位元組的節點區塊,不夠了,但是記憶體池中有8個位元組的空間,當然不能夠浪費咯,趕緊分配出去)然後去往記憶體池中注入記憶體(就是再去開闢一些放進記憶體池裡)。

這個是《stl原始碼剖析》裡的乙個例子

當整個系統堆得記憶體都不夠了的時候,就chunk_malloc()就會四處尋找可用記憶體,嘗試釋放一些沒用的空間,如果還是無法找到就去呼叫第一級配置器,因為一級配置器裡有記憶體不足處理例程

STL記憶體配置器

一 stl記憶體配置器的總體設計結構 1.兩級記憶體配置器 sgi stl中設計了兩級的記憶體配置器,主要用於不同大小的記憶體分配需求,當需要分配的記憶體大小大於128bytes時,使用第一級配置器,否則使用第二級配置器 對於小塊的記憶體的分配使用第二級配置器使用分配與釋放記憶體塊的效率更高,時間複...

STL配置器的記憶體分配策略

stl的幾個組成部分 1.容器 各種資料結構 2.演算法 各種常用演算法 3.迭代器 容器與演算法之間的聯合器,泛型指標 4.仿函式 協助演算法完成不同的策略的變化?5.介面卡 修飾或套接仿函式?6.配置器 分配空間管理 配置器的記憶體空間管理策略 一級配置器 對於大於128b的空間,使用一級配置器...

STL的記憶體配置器分配例子

在stl中考慮到小型區塊所可能造成的記憶體破碎問題,sgi stl設計了雙層級配置器,第一級配置器直接使用malloc 和free 第二級配置器則視情況採用不同的策略 當配置區塊超過128bytes時,則視之為足夠大,便呼叫第一級配置器 當配置區塊小於128bytes時,則視之為過小,為了降低額外負...