1. 什麼是記憶體池
「池」是在計算機技術中經常使用的一種設計模式,其內涵在於:將程式中需要經常使用的核心資源先申請出來,放到乙個池內,由程式自己管理,這樣可以提高資源的使用效率,也可以保證本程式占有的資源數量。經常使用的池技術包括記憶體池、執行緒池和連線池等,其中尤以記憶體池和執行緒池使用最多。
記憶體池(memorypool)是一種動態記憶體分配與管理技術。通常情況下,程式設計師習慣直接使用new、delete、malloc、free等api申請分配和釋放記憶體,導致的後果是:當程式長時間執行時,由於所申請記憶體塊的大小不定,頻繁使用時會造成大量的記憶體碎片從而降低程式和作業系統的效能。記憶體池則是在真正使用記憶體之前,先申請
分配一大塊記憶體(記憶體池)留作備用,當程式設計師申請記憶體時,從池中取出一塊動態分配,當程式設計師釋放記憶體時,將釋放的記憶體再放入池內,並盡量與周邊的空閒記憶體塊合併。若記憶體池不夠時,則自動擴大記憶體池,從作業系統中申請更大的記憶體池。
記憶體池的應用場景
早期的記憶體池技術是為了專門解決那種頻繁申請和釋放相同大小記憶體塊的程式,因此早期的一些記憶體池都是用相同大小的記憶體塊鍊錶組織起來的。
boost的記憶體池則對記憶體塊的大小是否相同沒有限制,因此只要是頻繁動態申請釋放記憶體的長時間執行程式,都適用boost記憶體池。這樣可以有效減少記憶體碎片並提高程式執行效率。記憶體池記憶體重分配機制:再次申請的記憶體為2*當前記憶體池的大小。
2. 記憶體池的特徵
2.2 申請的記憶體陣列沒有被填充
2.3 任何陣列記憶體塊的位置都和使用operator new分配的記憶體塊位置一致
2.4 記憶體池要比直接使用系統的動態記憶體分配快
3. boost記憶體池的分類
boost記憶體池按照不同的理
念分為四類。主要是兩種理念的不同造成了這樣的分類。
二是記憶體溢位的處理方式。
根據以上的理念,boost的記憶體池分為四種。
pool 是乙個 object usage 的記憶體池,溢位時返回 null。
object_pool 與 pool 類似,唯一的區別是當其分配的記憶體釋放時,它會嘗試呼叫該物件的析購函式。
singleton_pool 是乙個 singleton usage 的記憶體池,溢位時返回 null。
pool_alloc 是乙個 singleton usage 的記憶體池,溢位時丟擲異常。
pool
使用舉例:
使用時,指定分配塊的大小。
pool<> mypool(sizeof(int));
for (int i = 0; i < 10; i++)
object_pool
因此,最好將 construct 和 destroy 配對使用,將 malloc 和 free 配對使用,而不要兩者混用。
使用舉例:
指定分配物件的型別
object_poolmyobjectpool;
for (int j = 0; j < 10; j++)
}
singleton_pool
使用舉例:
可以定義多個pool型別的object,都是分配同樣大小的記憶體塊;singleton_pool提供靜態成員方法分配記憶體,不用定義object。
struct intpool ;
struct intpool2 ;
typedef singleton_poolipool1;
typedef singleton_poolipool2;
for (int i = 0; i < 10; ++i)
ipool1::purge_memory();
ipool2::purge_memory();
pool_allocator
使用舉例:
void func()
boost.pool記憶體池
boost庫之pool的使用
測試boost記憶體池
最近測試了一下boost執行緒池,向大家公布一下測試結果,本測試在單執行緒環境下進行,boost pool實用單執行緒記憶體方法 boost singleton pool適用多執行緒記憶體訪問 測試 如下 struct student void heapallocate for int j 0 j ...
boost庫記憶體池使用
記憶體池 memory pool 是一種記憶體分配方式。通常我們習慣直接使用new malloc等api申請分配記憶體,這樣做的缺點在於 由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記...
boost的pool記憶體池
參考 boost程式庫開發完全指南 pool func eg.h pragma once include includeusing namespace boost void eg void eg object pool void eg construct void eg singleton pool...