記憶體池的作用--減少記憶體碎片
阿新 • • 發佈:2019-02-08
1 記憶體池出現的必要性和原因
C/C++下記憶體管理是讓幾乎每一個程式設計師頭疼的問題,分配足夠的記憶體、追蹤記憶體的分配、在不需要的時候釋放記憶體——這個任務相當複雜。而直接使用系統呼叫malloc/free、new/delete進行記憶體分配和釋放,有以下弊端:
- 呼叫malloc/new,系統需要根據“最先匹配”、“最優匹配”或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free/delete,系統可能需要合併空閒記憶體塊,這些會產生額外開銷
- 頻繁使用時會產生大量記憶體碎片,從而降低程式執行效率
- 容易造成記憶體洩漏
記憶體池(memory pool)是代替直接呼叫malloc/free、new/delete進行記憶體管理的常用方法,當我們申請記憶體空間時,首先到我們的記憶體池中查詢合適的記憶體塊,而不是直接向作業系統申請,優勢在於:
- 比malloc/free進行記憶體申請/釋放的方式快
- 不會產生或很少產生堆碎片
- 可避免記憶體洩漏
從這裡下載該記憶體池實現的原始碼。
首先給出該方案的整體架構,如下:
圖1.記憶體池架構圖
結構中主要包含block、list 和pool這三個結構體,block結構包含指向實際記憶體空間的指標,前向和後向指標讓block能夠組成雙向連結串列;list結構中free指標指向空閒 記憶體塊組成的連結串列,used指標指向程式使用中的記憶體塊組成的連結串列,size值為記憶體塊的大小,list之間組成單向連結串列;pool結構記錄list連結串列的頭和尾。
申請:根據所申請記憶體的大小,遍歷list連結串列,檢視是否存在相匹配的size;