為什仫要使用記憶體池?
1.通常我們用new/delete和malloc/free來管理記憶體,可能會需要頻繁的呼叫記憶體,減少執行時間,增加效率.
2.避免記憶體碎片
傳統的new/delete的弊端》
1.分配記憶體時要檢視空閒分割槽表,根據一定的演算法來分配,比如最佳適應演算法,最差適應演算法...,然後更新空閒分割槽表.釋放的時候,也需要在空閒分割槽表中加入該釋放的記憶體,如果上下也是空閒的還需要將記憶體碎片合併為乙個大的空閒分割槽 .
2.預設的記憶體管理函式還考慮了多執行緒的應用,增加了開銷.
3.頻繁的申請和釋放還將導致記憶體碎片.
記憶體池是在真正使用記憶體之前,先申請乙個大的記憶體塊.當需要使用記憶體時,就從記憶體池中分配一塊使用,當使用完了不用還給作業系統而是還給記憶體池。如果記憶體池不夠就向記憶體申請一塊更大的記憶體塊.
存在記憶體池的好處?
1.因為申請的記憶體都比較大,所以降低了外部碎片(記憶體碎片).
2.因為是一次性申請一塊較大的記憶體,避免了頻繁的向記憶體的請求操作,提高了記憶體的分配效率,避免記憶體洩漏.
內碎片
分配記憶體時的大小比需求的記憶體大,有部分記憶體未使用,這塊未使用的記憶體就稱為內碎片
外碎片/記憶體碎片
當空閒的儲存器的和計起來足夠滿足乙個分配請求,但是沒有乙個單獨的空閒塊足夠大可以處理這個請求
下面介紹一種高效的記憶體池,它的實現類似鍊錶,鍊錶上的每個結點都是乙個物件池,如果申請物件則去記憶體池中申請,歸還的時候還給記憶體池即可.
size_t _countin; //當前結點的計數
blocknode *_first;
blocknode *_last;
size_t _maxnum; //結點申請記憶體塊物件的個數
static size_t _itemsize; //單個物件的大小
t *_lastdelete;
public:
objectpool(size_t initnum=32,size_t maxnum=1000000)
:_countin(0)
,_maxnum(maxnum)
,_lastdelete(null)
~objectpool()
void destroy()
_first=_last=null;
} t* new()
if(_countin >= _last->_objnum) //申請新的結點和物件
t *obj=(t *)((char *)_last->_memory + _countin*_itemsize);
_countin++;
return new(obj)t();
} void delete(t *ptr) }
protected:
static size_t getitemsize() };
templatesize_t objectpool::_itemsize=objectpool::getitemsize();
over~~~
乙個簡單的記憶體池
記憶體池是我們經常使用的一種池,常見的池還有程序池 執行緒池和連線池,今天我們就先討論記憶體池。首先看一下池的定義 池 池就是在初始時,申請比剛開始要使用的資源大的多的資源空間,接下來使用時,直接從池中獲取資源。記憶體池 即在初始時申請分配一定數量的。大小相等的記憶體塊留作備用,此後如有需要直接從該...
乙個簡單記憶體池實現
最近面試被問了乙個記憶體池的實現,關鍵是記憶體塊的組織,說來慚愧,由於之前沒有詳細去了解過實現,只記得作業系統上有說過空閒鍊錶的實現,即按分配的塊用鍊錶鏈結,有小塊優先,大塊優先等 後來回來認真地找了幾個記憶體池實現的技術介紹,多數是以乙個固定塊,每個塊又有固定長度的單元組成。參考了網上的一些實現方...
C 實現乙個簡單記憶體池
在使用記憶體池進行記憶體管理之前,通常使用new malloc或者delete free來申請或者釋放記憶體。在這個過程中,系統要首先查詢內部維護的記憶體空閒塊表,並且需要根據比如lru等記憶體分配演算法找到合適大小的空閒記憶體塊。如果該空閒記憶體塊過大,還需要切割成已分配的部分和較小的空閒塊。然後...