boost::pool概览

转载 2012年03月27日 22:15:09

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

  1. 能够有效地管理许多小型对象的分配和释放工作,避免了自己去管理内存而产生的内存碎片和效率低下问题。

  2.  告别程序内存泄漏的烦恼,pool库会在内部对内存自动进行管理,避免了程序员一不小心而造成的内存泄漏问题。

      pool库主要提供了四种内存池接口,分别是pool、object_pool、singleton_pool和pool_allocator(fast_pool_allocator)。

 

1.   pool


pool是最简单也最容易使用的内存池类,可以返回一个简单数据类型(POD) 的内存指针。它

pool很容易使用,可以像C中的malloc()一样分配内存,然后随意使用。除非有特殊要求,否则不必对分配的内存调用free()释放,pool会很好地管理内存。例如:

  1. #include <boost/pool/pool.hpp>    
  2. using namespace boost;    
  3. int main()    
  4. {        
  5.     pool<> pl(sizeof(int));             //一个可分配int的内存池         
  6.     int *p = (int *)pl.malloc();        //必须把void*转换成需要的类型        
  7.     assert(pl.is_from(p));         
  8.     pl.free(p);                         //释放内存池分配的内存块        
  9.     for (int i = 0;i < 100; ++i)        //连续分配大量的内存        
  10.     {     
  11.         pl.ordered_malloc(10);    
  12.     }    
  13. }   
 

 

2.  object_pool

 

object_pool是用于类实例(对象)的内存池,它的功能与pool类似,但会在析构时对所有已经分配的内存块调用析构函数,从而正确地释放资源。

 

malloc()和free()函数分别分配和释放一块类型为ElementType*的内存块,同样,可以用is_from()来测试内存块的归属,只有是本内存池分配的内存才能被free()释放。但它们被调用时并不调用类的构造函数和析构函数,也就是说操作的是一块原始内存块,里面的值是未定义的,因此我们应当尽量少使用malloc()和free()。

object_pool的特殊之处是construct()和destroy()函数,这两个函数是object_ pool的真正价值所在。construct()实际上是一组函数,有多个参数的重载形式(目前最多支持3个参数,但可以扩展),它先调用malloc()分配内存,然后再在内存块上使用传入的参数调用类的构造函数,返回的是一个已经初始化的对象指针。destory()则先调用对象的析构函数,然后再用free()释放内存块。

这些函数都不会抛出异常,如果内存分配失败,将返回0。

 

object_pool的用法也是很简单,我们既可以像pool那样分配原始内存块,也可以使用construct()来直接在内存池中创建对象。当然,后一种使用方法是最方便的,也是本书所推荐的。

 

下面的代码示范了object_pool的用法:

  1. #include <boost/pool/object_pool.hpp>   
  2. using namespace boost;    
  3. struct demo_class                           //一个示范用的类    
  4. {    
  5. public:        
  6.     int a,b,c;        
  7.     demo_class(int x = 1, int y = 2, int z = 3):a(x),b(y),c(z){}    
  8. };    
  9. int main()    
  10. {        
  11.     object_pool<demo_class> pl;             //对象内存池         
  12.     demo_class *p = pl.malloc();            //分配一个原始内存块        
  13.     assert(pl.is_from(p));       //p指向的内存未经过初始化        
  14.     assert(p->a!=1 || p->b != 2 || p->c !=3);         
  15.     p = pl.construct(7, 8, 9);              //构造一个对象,可以传递参数        
  16.     assert(p->a == 7);         
  17.     object_pool<string> pls;                //定义一个分配string对象的内存池        
  18.     for (int i = 0; i < 10 ; ++i)           //连续分配大量string对象        
  19.     {            
  20.         string *ps = pls.construct("hello object_pool");            
  21.         cout << *ps << endl;        
  22.     }    
  23. }                                           //所有创建的对象在这里都被正确析构、释放内存   
 

 

3.   singleton_pool

 

 

singleton_pool与pool的接口完全一致,可以分配简单数据类型(POD)的内存指针,但它是一个单件,并提供线程安全。

 

 

singleton_pool主要有两个模板类型参数(其余的可以使用缺省值)。第一个Tag仅仅是用于标记不同的单件,可以是空类,甚至是声明(这个用法还被用于boost.exception,参见4.9小节,136页)。第二个参数RequestedSize等同于pool构造函数中的整数requested_ size,指示pool分配内存块的大小。

singleton_pool的接口与pool完全一致,但成员函数均是静态的,因此不需要声明singleton_pool的实例 ,直接用域操作符::来调用静态成员函数。因为singleton_pool是单件,所以它的生命周期与整个程序同样长,除非手动调用release_memory()或purge_memory(),否则singleton_pool不会自动释放所占用的内存。除了这两点,singleton_pool的用法与pool完全相同。

下面的代码示范了singleton_pool的用法:

  1. #include <boost/pool/singleton_pool.hpp>    
  2. using namespace boost;    
  3. struct pool_tag{};                                  //仅仅用于标记的空类    
  4. typedef singleton_pool<pool_tag, sizeof(int)> spl;  //内存池定义    
  5. int main()    
  6. {        
  7.     int *p = (int *)spl::malloc();                      //分配一个整数内存块        
  8.     assert(spl::is_from(p));        
  9.     spl::release_memory();                              //释放所有未被分配的内存    
  10. }                                                       //spl的内存直到程序结束才完   
 

 

 

singleton_pool在使用时最好使用typedef来简化名称,否则会使得类型名过于冗长而难以使用。如代码中所示:

  1. typedef singleton_pool<pool_tag, sizeof(int)> spl;   
 

用于标记的类pool_tag可以再进行简化,直接在模板参数列表中声明tag类,这样可以在一条语句中完成对singleton_pool的类型定义,例如:

 

  1. typedef singleton_pool<struct pool_tag, sizeof(int)> spl;   

 

更多内容参考http://www.cnblogs.com/hujian/archive/2009/07/10/1520233.html

http://mail.ustc.edu.cn/~jxw95216/boost_doc/libs/pool/doc/index.html

boost及其子库pool内存池的使用

1.什么是boost库?boost库是一个可移植并提供源代码的C++库,是标准可的后备库,是C++标准化开发进程之一。 boost库是为C++语言标准库提供扩展的程序库总称。 2.boost程序库的下...
  • a200800170331
  • a200800170331
  • 2015年09月17日 19:15
  • 1826

boost pool实现详解

转自:http://www.cppblog.com/pizzx/archive/2014/06/18/207324.html 使用boost::object_pool来创建对象(见上...
  • tomisaboy
  • tomisaboy
  • 2016年06月07日 13:12
  • 573

boost之pool源码解析

看完了c++设计新思维中的内存池实现,再粗略看下boost中pool的实现。可以看出两者有些相似之处。 查看罗剑锋的boost程序库完全开发指南会发现对内存池pool讲解甚是简单 没有标明任何注意事项...
  • hjing1988
  • hjing1988
  • 2015年06月23日 19:03
  • 1222

boost::pool与内存池技术

建议看这个链接的内容:http://cpp.winxgui.com/cn:mempool-example-boost-pool    Pool分配是一种分配内存方法,用于快速分配同样大小的内存块,  ...
  • xushiweizh
  • xushiweizh
  • 2006年11月21日 00:38
  • 16390

boost pool性能对比

// testPool.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include usin...
  • zyyoung
  • zyyoung
  • 2011年03月01日 12:32
  • 1680

初探boost之pool库学习笔记

pool   内存池概述
  • wxwd1
  • wxwd1
  • 2014年07月19日 01:05
  • 1752

boost pool, object_pool实现

一: class simple_segregated_storage; boost/pool/simple_segregated_storage.hpp simple_segregated_sto...
  • kannju
  • kannju
  • 2011年09月01日 16:39
  • 971

boost::threadpool线程池使用实例

前言: 什么是多线程?比如在做一些下载的程序时,同时开启5个下载任务,对应的其实就是多线程。在一些多线程的程序中,响应请求的个数(即线程)的个数过多的话就会造成系统资源损耗过多而宕机,一般最多线程...
  • qingzai_
  • qingzai_
  • 2015年03月20日 10:33
  • 7104

C++内存管理变革(4):boost::object_pool与gc allocator

本文已经迁移到: http://cpp.winxgui.com/cn:gc-allocator-and-boost-object-poolC++内存管理变革(4): boost::object_poo...
  • xushiweizh
  • xushiweizh
  • 2007年04月21日 20:59
  • 10731

boost之memory pool

singleton_pool分配的内存一般以release_memory/purge_memory方式释放 内存分配失败一般返回0 odered vs unorder: 都用链表维护,前者维护顺序,后...
  • pud_zha
  • pud_zha
  • 2013年02月20日 14:13
  • 3405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:boost::pool概览
举报原因:
原因补充:

(最多只允许输入30个字)