博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost pool内存池库使用简要介绍
阅读量:5952 次
发布时间:2019-06-19

本文共 2954 字,大约阅读时间需要 9 分钟。

hot3.png

      我厂内存次神马的一般都自己实现。我曾经也自己写过一个demo()。后来发现boost库里面有一个内存池库boost pool,貌似很好用,使用挺好,例子可以贴出来。

      boost一共有4种内存池,为pool, object_pool, singleton_pool, pool_alloc。其中前三种应该应用都很多,我这里仅仅只有前2个demo.

1 pool

      pool是最简单的内存池类,可以返回一个无符号的内存指针。因为我平时C用的远比C++多,所以这个类其实更适合我使用。

      它的原理我没有细看。理论上也是每次分配一大块内存,这个内存卡会被分成小块,通过链表进行相连。链表至少记录当前可以分配的内存以及已经分配过正在使用的内存。每次分配都从可以分配链表分配即可。

      他只要有2个函数可以供大家使用:malloc和free。据说free不用程序猿自己搞,pool类可以自行回收。anyway,自己显示调用free肯定没问题。

      下面是调用例子

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内部使用了 。就是申请一个 my_pool_test_t,赋值并使用。

2 object_pool

      从名字也可以看出来,这个内存池是对象内存次,是分配object的。

      他和pool最大的区别也在此。 pool每次需要指定分配大小,它不需要,但是他需要指定分配的类型(其实通过类型能算出大小)。

      示例代码如下:

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 
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;}
      这个就是直接分配一个类Class_Demo的内存池,赋值打印完事。

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
#include
#include
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
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: */
      编译(请自行指定boost库地址)

g++ test_mem.cpp -o mem -I ../include/ -L../lib -lboost_system -lboost_thread
      执行,发现一切预期之内
liujun05@cq01-rdqa-dev012.cq01:~/test/boost/test$ ./mem pool a: 100pool b2:        4object pool a:  2object pool b:  3

转载于:https://my.oschina.net/jungleliu0923/blog/203314

你可能感兴趣的文章
自动完成文本框AutoCompleteTextView
查看>>
【Android】【录音】Android录音--AudioRecord、MediaRecorder
查看>>
微软开源C++ REST SDK——Casablanca
查看>>
技术能力与真不是几年经验成正比的
查看>>
文件IO open 与 标准 IO fopen 的对应
查看>>
“云经济”与创新
查看>>
cell smart restore from backup等待事件
查看>>
php中输入这个网站的网址跳转到你定义的页面代码
查看>>
关于左移右移的操作 学习
查看>>
利用泛型写一个简单的链表
查看>>
Android 自动判断是电话,网址,EMAIL方法之Linkify
查看>>
Java Quartz 自动调度
查看>>
VS2012:出现devenv.sln解决方案保存对话框
查看>>
ubuntu 10.10下面添加samba实现和windows共享文件
查看>>
参数过滤mongodb过滤查询键值
查看>>
关于技术的学习及批判
查看>>
转发网络《iOS网络编程与云端应用最佳实践》微博转发送书了
查看>>
车牌识别及验证码识别的一般思路
查看>>
hdu 3560(dfs判环)
查看>>
C/C++头文件一览
查看>>