日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

boost pool内存池库使用简要介绍

發(fā)布時(shí)間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 boost pool内存池库使用简要介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。