記憶體池(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...