boost庫記憶體池使用

2021-06-17 17:13:56 字數 1957 閱讀 8504

記憶體池(memory pool)是一種記憶體分配方式。        通常我們習慣直接使用new、malloc等api申請分配記憶體,這樣做的缺點在於:由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。

記憶體池則是在真正使用記憶體之前,先申請分配一定數量的、大小相等(一般情況下)的記憶體塊留作備用。當有新的記憶體需求時,就從記憶體池中分出一部分記憶體塊,若記憶體塊不夠再繼續申請新的記憶體。這樣做的乙個顯著優點是盡量避免了記憶體碎片,使得記憶體分配效率得到提公升。

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

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

使用pool記憶體池主要有以下兩個優點:

1.能夠有效地管理許多小型物件的分配和釋放工作,避免了自己去管理記憶體而產生的記憶體碎片和效率低下問題。

2. 告別程式記憶體洩漏的煩惱,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 記憶體池

1.什麼是記憶體池 池 是在計算機技術中經常使用的一種設計模式,其內涵在於 將程式中需要經常使用的核心資源先申請出來,放到乙個池內,由程式自己管理,這樣可以提高資源的使用效率,也可以保證本程式占有的資源數量。經常使用的池技術包括記憶體池 執行緒池和連線池等,其中尤以記憶體池和執行緒池使用最多。記憶體...

測試boost記憶體池

最近測試了一下boost執行緒池,向大家公布一下測試結果,本測試在單執行緒環境下進行,boost pool實用單執行緒記憶體方法 boost singleton pool適用多執行緒記憶體訪問 測試 如下 struct student void heapallocate for int j 0 j ...

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...