boost pool内存池库使用简要介绍
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
? ? ? 我廠內(nèi)存次神馬的一般都自己實(shí)現(xiàn)。我曾經(jīng)也自己寫(xiě)過(guò)一個(gè)demo(mempool)。后來(lái)發(fā)現(xiàn)boost庫(kù)里面有一個(gè)內(nèi)存池庫(kù)boost pool,貌似很好用,使用挺好,例子可以貼出來(lái)。
? ? ??boost一共有4種內(nèi)存池,為pool,?object_pool,?singleton_pool,?pool_alloc。其中前三種應(yīng)該應(yīng)用都很多,我這里僅僅只有前2個(gè)demo.
1 pool
? ? ??pool是最簡(jiǎn)單的內(nèi)存池類,可以返回一個(gè)無(wú)符號(hào)的內(nèi)存指針。因?yàn)槲移綍r(shí)C用的遠(yuǎn)比C++多,所以這個(gè)類其實(shí)更適合我使用。
? ? ??它的原理我沒(méi)有細(xì)看。理論上也是每次分配一大塊內(nèi)存,這個(gè)內(nèi)存卡會(huì)被分成小塊,通過(guò)鏈表進(jìn)行相連。鏈表至少記錄當(dāng)前可以分配的內(nèi)存以及已經(jīng)分配過(guò)正在使用的內(nèi)存。每次分配都從可以分配鏈表分配即可。
? ? ??他只要有2個(gè)函數(shù)可以供大家使用:malloc和free。據(jù)說(shuō)free不用程序猿自己搞,pool類可以自行回收。anyway,自己顯示調(diào)用free肯定沒(méi)問(wèn)題。
? ? ??下面是調(diào)用例子
typedef struct _my_pool_test_t {int a;int b[]; } my_pool_test_t;void test_pool() {pool<> pl( sizeof(my_pool_test_t) + 5* sizeof(int) );my_pool_test_t* test = (my_pool_test_t*)pl.malloc();test->a = 100;for(int i=0; i<5; i++){test->b[i] = i+2;}cout << "pool a:\t" << test->a << endl;cout << "pool b2:\t" << test->b[2] << endl;pl.free(test); } 其中my_pool_test_t內(nèi)部使用了 柔性數(shù)組。就是申請(qǐng)一個(gè) my_pool_test_t,賦值并使用。2 object_pool
? ? ??從名字也可以看出來(lái),這個(gè)內(nèi)存池是對(duì)象內(nèi)存次,是分配object的。
? ? ??他和pool最大的區(qū)別也在此。?pool每次需要指定分配大小,它不需要,但是他需要指定分配的類型(其實(shí)通過(guò)類型能算出大小)。
? ? ? 示例代碼如下:
class Class_Demo {public:int a;int b;Class_Demo(int ia=1, int ib =2 ) : a(ia), b(ib) {} };void test_object_pool() {object_pool <Class_Demo> pclass;Class_Demo *cl = pclass.malloc();cl = pclass.construct(2,3);cout << "object pool a:\t" << cl -> a << endl;cout << "object pool b:\t" << cl -> b << endl; } 這個(gè)就是直接分配一個(gè)類Class_Demo的內(nèi)存池,賦值打印完事。3 全部代碼
test_mem.cpp
/**************************************************************************** * Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved* **************************************************************************//*** @file test_mem.cpp* @author liujun05(com@baidu.com)* @date 2014/02/26 14:04:16* @brief * **/#include<boost/pool/object_pool.hpp> #include<boost/pool/pool.hpp> #include<iostream> using namespace std; using namespace boost;typedef struct _my_pool_test_t {int a;int b[]; } my_pool_test_t;class Class_Demo {public:int a;int b;Class_Demo(int ia=1, int ib =2 ) : a(ia), b(ib) {} };void test_pool() {pool<> pl( sizeof(my_pool_test_t) + 5* sizeof(int) );my_pool_test_t* test = (my_pool_test_t*)pl.malloc();test->a = 100;for(int i=0; i<5; i++){test->b[i] = i+2;}cout << "pool a:\t" << test->a << endl;cout << "pool b2:\t" << test->b[2] << endl;pl.free(test); }void test_object_pool() {object_pool <Class_Demo> pclass;Class_Demo *cl = pclass.malloc();cl = pclass.construct(2,3);cout << "object pool a:\t" << cl -> a << endl;cout << "object pool b:\t" << cl -> b << endl; }int main() {test_pool();test_object_pool();return 0; }/* vim: set expandtab ts=4 sw=4 sts=4 tw=100: */ 編譯(請(qǐng)自行指定boost庫(kù)地址)
g++ test_mem.cpp -o mem -I ../include/ -L../lib -lboost_system -lboost_thread 執(zhí)行,發(fā)現(xiàn)一切預(yù)期之內(nèi) liujun05@cq01-rdqa-dev012.cq01:~/test/boost/test$ ./mem pool a: 100 pool b2: 4 object pool a: 2 object pool b: 3
轉(zhuǎn)載于:https://my.oschina.net/jungleliu0923/blog/203314
總結(jié)
以上是生活随笔為你收集整理的boost pool内存池库使用简要介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux脚本利器sed
- 下一篇: django基础1--django安装与