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相关推荐

  1. C++ boost 实例学习

    boost生成和解析json的完整例子 http://blog.csdn.net/dotphoenix/article/details/27081377 // // json_parser.h // ...

  2. 服务器设计系列:内存管理

    服务器性能的关键在于内存.从收包到解析,到消息内存的申请,到session结构内存的申请都要小心处理,尽量减少内存数据copy,减少内存动态申请,减少内存检索.为达到这个目的,不同的地方有不同的方法, ...

  3. linux boost内存池,C++ boost库教程之内存池

    Boost  Pool 库提供了一个内存池分配器,它是一个工具,用于管理在一个独立的.大的分配空间里的动 态内存.当你需要分配和回收许多不的对象或需要更高效的内存控制时,使用内存池是一个好的 解决方案 ...

  4. BOOST内存管理(二) --- boost::pool

    Boost库的pool提供了一个内存池分配器,用于管理在一个独立的.大的分配空间里的动态内存分配.Boost库的pool主要适用于快速分配同样大小的内存块,尤其是反复分配和释放同样大小的内存块的情况. ...

  5. boost::pool

    Boost库的pool提供了一个内存池分配器,用于管理在一个独立的.大的分配空间里的动态内存分配.Boost库的pool主要适用于快速分配同样大小的内存块,尤其是反复分配和释放同样大小的内存块的情况. ...

  6. 读《Boost程序库完全开发指南》

    读<Boost程序库完全开发指南> 2011-05-18 20:47:19|  分类: 读书|举报|字号 订阅 C++确实很复杂,神一样的0x不知道能否使C++变得纯粹和干爽? boost ...

  7. Linux下安装 boost 库

    1. 先去官网下载压缩包: https://www.boost.org/ 2. 解压后cd 进入根目录,然后执行: ./bootstrap.sh 3. 安装(时间会很长): ./b2 install ...

  8. Mysql依赖库Boost的源码安装,linux下boost库的安装

    boost'准标准库'安装过程. 安装的是boost_1_60_0. (1)首先去下载最新的boost代码包,网址www.boost.org. (2)进入到自己的目录,解压: bzip2 -d boo ...

  9. 函数指针amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

最新文章

  1. AI一分钟 | 北京发放自动驾驶首批牌照,百度获准测试;亿航美国分公司申请破产,债务高达数百万美元
  2. 微生物组-宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)
  3. 将.NET概念映射到Lightning平台
  4. Activity 中的Toast在Activity销毁后报错,解决方法,把context改成应用的
  5. SCMagazine: SIEM走出阴影,迈向光明
  6. 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
  7. camel研究_【卡瑞利珠单抗·CameL研究者说】任秀宝教授:卡瑞利珠单抗治疗NSCLC疗效与安全性俱佳,受指南重磅推荐后再获批肺癌适应症...
  8. Android-failed to set system property
  9. 老师一天表情大全,也太搞笑了!
  10. arcgis人口空间化_基于遥感和GIS的人口数据空间化研究进展及案例分析
  11. 手机二维码软件及资源大汇总
  12. 五一放一天不调休,你能接受吗?
  13. WEEK 15 C ZJM 与纸条
  14. 培训机构让Github的含金量降低了?
  15. Python爬虫网站图片并下载到本地
  16. 机器学习应用设计阶段的 10 个陷阱和 11 个最佳实践
  17. 阿汤哥的四条领导力经验
  18. MySql下关于时间范围的between查询
  19. NC开发笔记——NC63开发方法总结
  20. Oracle与plsqldev,oracle与PLSQLDev的链接問題

热门文章

  1. Python学习入门基础教程(learning Python)--3.3.4 Python的if-elif-else语句
  2. Rails安全导读【完】
  3. 数据结构的简单理解(4)
  4. 2021牛客多校10 - Train Wreck(贪心)
  5. CodeForces - 1208F Bits And Pieces(SOSdp+贪心)
  6. CodeForces - 787D - Legacy(线段树优化建图+最短路)
  7. CodeForces - 1321B Journey Planning(思维)
  8. qduoj - WHY吃糖果(二分套二分)
  9. python基础语法-异常处理
  10. 远程登录另一个mysql 数据库_Ubuntu中开启MySQL远程访问功能,并将另一个数据库服务器中的数据迁移到新的服务器中...