boost pool與記憶體池技術

2021-05-22 04:46:52 字數 1633 閱讀 6201

pool分配是一種分配記憶體方法,用於快速分配同樣大小的記憶體塊,

尤其是反覆分配/釋放同樣大小的記憶體塊的情況。

快速分配小塊記憶體,如果pool無法提供小塊記憶體給使用者,返回0。

example:

void

func()

pool的析構函式會釋放所有從系統申請到的記憶體。

與pool的區別在於:pool需要指定每次分配的塊的大小,object_pool需要指定

每次分配的物件的型別。

example:

struct

x ; 

//has destructor with side-effects

void

func()}

與pool用法一樣。不同的是:可以定義多個pool型別的object,都是分配同樣

大小的記憶體塊;singleton_pool提供靜態成員方法分配記憶體,不用定義object。

example:

struct

mypooltag ;

typedef boost::singleton_pool

<

mypooltag, 

sizeof

(int

)>

my_pool;

void

func()

my_pool::purge_memory();

//釋放my_pool申請的記憶體。}

基於singleton_pool實現,提供allocator(用於stl等)。

example:

void

func()

需要的話,必須自己顯式地呼叫

boost::singleton_pool::release_memory()

把allocator分配的記憶體返回系統。

pool每次向系統申請一大塊記憶體,然後分成同樣大小的多個小塊,

形成鍊錶連線起來。每次分配的時候,從鍊錶中取出頭上一塊,提

供給使用者。鍊錶為空的時候,pool繼續向系統申請大塊記憶體。

乙個小問題:在pool的實現中,在申請到大塊記憶體後,馬上把它分

成小塊形成鍊錶。這個過程開銷比較大。即你需要分配一小塊記憶體

時,卻需要生成乙個大的鍊錶。用如下**測試:

boost::pool

<>

mem_pool(

16);

for(i =0

; i 

<

npass; i

++) 

for(n =0

; n 

<

nitem; n

++) 

period 

=clock() 

-period;

printf(

"pool<>  : period = %5d ms

", period);}

可以發現,第一遍花的時間明顯多於後面的。

而且在pool的使用過程中如果不是恰好把鍊錶中所有的小塊都用上

的話,在鍊錶中最後的一些小塊會始終用不上。把這些小塊加入鏈

表是多餘的。雖然這個開銷可能很小:)

boost pool記憶體池使用

1 boost pool只能作為普通資料型別的記憶體池,如int double等,因為他只分配記憶體,不呼叫建構函式。2 如果記憶體分配失敗,不拋異常,我們應該判斷返回的指標是不是nullptr,防止空指標錯誤。3 我們一般不應該手工呼叫free 等釋放記憶體的函式,應該交給記憶體池自動進行管理。如...

記憶體池技術

經典的記憶體池技術 經典的記憶體池 mempool 技術,是一種用於分配大量大小相同的小物件的技術。通過該技術可以極大加快記憶體分配 釋放 過程。下面我們詳細解釋其中的奧妙。經典的記憶體池只涉及兩個常量 memblocksize itemsize 小物件的大小,但不能小於指標的大小,在32位平台也就...

記憶體池技術

記憶體池技術是一種飽受爭議的技術 爭議熱點在於到底有沒有必要自己實現。1.記憶體池技術出現在libc尚不成熟的時候,當時程式經常在執行一段時間後效能下降,當時維護記憶體池很有必要 2.現在64位伺服器經常是32g以上的記憶體,管理記憶體碎片意義不打 3.寫malloc的各位都是大神,自己寫有99 的...