boost::fast_pool_allocator
Boost庫的pool提供了一個內存池分配器,用于管理在一個獨立的、大的分配空間里的動態內存分配。Boost庫的pool主要適用于快速分配同樣大小的內存塊,尤其是反復分配和釋放同樣大小的內存塊的情況。使用pool內存池主要有以下兩個優點:
1. 能夠有效地管理許多小型對象的分配和釋放工作,避免了自己去管理內存而產生的內存碎片和效率低下問題。 2. ?告別程序內存泄漏的煩惱,pool庫會在內部對內存自動進行管理,避免了程序員一不小心而造成的內存泄漏問題。 ? ? ?
? pool庫主要提供了四種內存池接口,分別是pool、object_pool、singleton_pool和pool_allocator(fast_pool_allocator)。
pool接口:頭文件為<boost/pool/pool.hpp>,主要用于快速分配小塊內存,使用時需要指定每次要分配的內存塊的大小。其malloc函數用于從內存池中分配內存;free函數用于釋放內存,并交還給內存池,而不是系統;release_memory函數用于釋放所有未被分配的內存;purge_memory函數用于釋放所有內存。當然,也可以不調用free或release_memory等函數,pool接口對象在析構時會調用purge_memory自動釋放所有內存。
示例代碼如下: ??
1 ? ?pool<> ?myPool(sizeof(int));?
2 ? ?for (int i = 0; i < 10; i++)
?3 ? ?{?
4 ? ? ? ?int *pnNum = (int *)myPool.malloc();
?5 ? ? ? ?*pnNum = i+1;?
6 ? ? ? ?cout << *pnNum << endl;
?7 ? ?} ? ?
object_pool接口:頭文件為<boost/pool/object_pool.hpp>,顧名思義,主要用于對象的內存分配并自動調用類的構造函數。其construct函數用于從內存池中分配內存并自動調用構造函數,其destroy函數用于釋放內存交還給內存池并自動調用析構函數。與pool接口一樣,也可以不調用destroy函數,object_pool接口對象在析構時會自動釋放所有內存并自動調用析構函數。另外,object_pool接口也有malloc和free函數,但其malloc只分配內存而不負責構造,free只釋放內存而不負責析構。因此,最好將construct和destroy配對使用,將malloc和free配對使用,而不要兩者混用。 示例代碼如下: ??
1 ? ? ? ? object_pool<CTest> ?myObjectPool;?
2 ? ? ? ? for (int j = 0; j < 10; j++)?
3 ? ? ? ? {?
4 ? ? ? ? ? ? CTest *pTest = (CTest *)myObjectPool.construct(j*j);?
5 ? ? ? ? ? ? if (j == 5)
? 6 ? ? ? ? ? ? {?
7 ? ? ? ? ? ? ? ? myObjectPool.destroy(pTest);?
8 ? ? ? ? ? ? }?
9 ? ? ? ? } ?
singleton_pool接口:頭文件為<boost/pool/singleton_pool.hpp>,singleton_pool接口的構造函數是私有的,因此不能夠創建一個singleton_pool接口的對象。singleton_pool接口提供了一些靜態方法如malloc、free用于內存的分配和釋放,其他方面與pool接口相同。
示例代碼如下: ? ?
1 struct intpool { }; ?
2 struct intpool2 { }; ?
3 typedef singleton_pool<intpool, sizeof(int)> ipool1; ?
4 typedef singleton_pool<intpool2, sizeof(int)> ipool2; ?
5 ? ? for (int i = 0; i < 10; ++i) ?
6 ? ? ?{ ?
7 ? ? ? ? ?int *q1 = (int *)ipool1::malloc(); ?
8 ? ? ? ? ?int *q2 = (int *)ipool2::malloc();?
?9 ? ? ? ? *q1 = i;?
10 ? ? ? ? *q2 = i*i;?
11 ? ? ? ? cout << *q1 << " and " << *q2 << endl;?
12 ? ? ?}?
13 ? ? ?ipool1::purge_memory();?
14 ? ? ?ipool2::purge_memory(); ? ?
pool_allocator接口:頭文件為<boost/pool/pool_allocator.hpp>,主要與STL的容器一起使用,可用于代替STL中的allocator。
示例代碼如下: ?
1 ? ?vector<int, pool_allocator<int> > ?vctTemp;?
2 ? ?list<char, fast_pool_allocator<char> > ?lstTemp; ? ??
其中,pool_allocator的內部實現調用了ordered_malloc和ordered_free,可以滿足對大量的連續內存塊的分配請求。fast_pool_allocator 的內部實現調用了malloc和free,比較適合于一次請求單個大內存塊的情況,但也適用于通用分配,不過具有一些性能上的缺點。
總結
以上是生活随笔為你收集整理的boost::fast_pool_allocator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GDB 单步调试
- 下一篇: 判断目录是否存在并创建mkdir