1. 程式人生 > >記憶體池的作用--減少記憶體碎片

記憶體池的作用--減少記憶體碎片

1 記憶體池出現的必要性和原因

C/C++下記憶體管理是讓幾乎每一個程式設計師頭疼的問題,分配足夠的記憶體、追蹤記憶體的分配、在不需要的時候釋放記憶體——這個任務相當複雜。而直接使用系統呼叫malloc/free、new/delete進行記憶體分配和釋放,有以下弊端:

  1. 呼叫malloc/new,系統需要根據“最先匹配”、“最優匹配”或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free/delete,系統可能需要合併空閒記憶體塊,這些會產生額外開銷
  2. 頻繁使用時會產生大量記憶體碎片,從而降低程式執行效率
  3. 容易造成記憶體洩漏

記憶體池(memory pool)是代替直接呼叫malloc/freenew/delete進行記憶體管理的常用方法,當我們申請記憶體空間時,首先到我們的記憶體池中查詢合適的記憶體塊,而不是直接向作業系統申請,優勢在於:

  1. 比malloc/free進行記憶體申請/釋放的方式快
  2. 不會產生或很少產生堆碎片
  3. 可避免記憶體洩漏
2 記憶體池的實現

這裡下載該記憶體池實現的原始碼。

首先給出該方案的整體架構,如下:

記憶體池實現架構

圖1.記憶體池架構圖

結構中主要包含blocklist 和pool這三個結構體,block結構包含指向實際記憶體空間的指標,前向和後向指標讓block能夠組成雙向連結串列;list結構中free指標指向空閒 記憶體塊組成的連結串列,used指標指向程式使用中的記憶體塊組成的連結串列,size值為記憶體塊的大小,list之間組成單向連結串列;pool結構記錄list連結串列的頭和尾。

申請:根據所申請記憶體的大小,遍歷list連結串列,檢視是否存在相匹配的size;