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