boost-pool用法介绍

原创 2013年12月04日 16:26:22

1.内存池是预先分配一块大的内存空间,然后可以再其中使用某种算法实现高效快速的自定制内存分配。内存池能够管理大量的对象,而且在需要大量地分配/释放小对象时很有效率,完全不用考虑delete,它近似于一个小型的垃圾回收机制。

一、pool类

pool类是一个可以返回POD的内存指针。位置:#include <boost/pool/pool.hpp>

类摘要:

template <typename UserAllocator = default_user_allocator_new_delete>
class pool
{
  private:
    pool(const pool &);
    void operator=(const pool &);

  public:
    explicit pool(size_type requested_size);//构造函数接受一个size_type类型的整数,表示分配内存块的大小(不是pool的大小)
    ~pool();

    bool release_memory();
    bool purge_memory();m 

    bool is_from(void * chunk) const;
    size_type get_requested_size() const;

    void * malloc();
    void * ordered_malloc();
    void * ordered_malloc(size_type n);

    void free(void * chunk);
    void ordered_free(void * chunk);
    void free(void * chunks, size_type n);
    void ordered_free(void * chunks, size_type n);
};
int main()
{
	pool<> p1(sizeof(int));//设定每次分配的大小为int大小。
	int *p = (int*)p1.malloc();//内存分配函数。用void*返回。

	p1.free(p);//规划内存给内存池。
	p1.is_from(p); //测试是否是从该pool中分配出去的。

	p1.ordered_malloc(10);//连续分配n块内存。
}
2.(最有用的) object_pool是用于类实例对象的内存池,与pool类似,但是析构时对所有分配的内存块调用析构函数。但是它的特殊之处在于:construct()和destroy()函数,construct()有多个参数的重载形式,它调用malloc()分配内存,然后在内存池中出入参数调用类的构造函数,返回的是一个已经初始化的对象的指针,destory()则先调用对象的析构函数,然后再用free()释放内存块。
位置:#include <boost/pool/object_pool.hpp>
template <typename ElementType, typename UserAllocator = default_user_allocator_new_delete>
class object_pool
{
  public:
    object_pool();
    ~object_pool();

    element_type * malloc();
    void free(element_type * p);
    bool is_from(element_type * p) const;

    element_type * construct();
    // other construct() functions
    void destroy(element_type * p);
};类似pool的用法。
#include <iostream>
#include <boost/smart_ptr.hpp>
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp>

using namespace boost;
using std::cout;
using std::endl;
using std::string;

class test
{
public:
    int a, b, c;
    test(int a1=1, int b1=2, int c1=3) : a(a1), b(b1), c(c1){}
    void display()
    {
        cout<<a<<endl;
        cout<<b<<endl;
        cout<<c<<endl;
    }
	~test()
	{
		cout<<"test, destory()"<<endl;
	}
};

int main() 
{
    object_pool<test> p1;    
    test *p = p1.malloc();
    p->a = 11, p->b = 22, p->c = 33;
    p->display();//11 22 33

    test *t = p1.construct(7, 8, 9);//调用构造函数构造一个初始化的对象。
    t->display();//7 8 9
	p1.destroy(p);//先调用析构函数,然后free内存返回给pool。
}


                

Selenium2中submit()方法的使用

在html中,关于form表单的部分,其中按钮类型就有button与submit,简单的来理解,button就是一个单纯的点击,submit就不是单纯的单击,它会涉及到前后台的交互, 在sele...
  • a5650892
  • a5650892
  • 2017年12月04日 12:00
  • 97

shell 中的括号 () 使用介绍

shell中的大括号,小括号语法分别概述   1.shell中的大括号和小括号   1.${var} 2.$(cmd) 3.() 和 {} 4.${var:-...
  • LittleTrace
  • LittleTrace
  • 2014年09月17日 23:06
  • 380

IOStream的用法总结

被复杂的IOStream弄晕了,因为经常会出现层层包裹的情况,学习了一天,发现其实挺有规律的,总结一下: 以输入流为例,输入流分为字节流和字符...
  • l465659833
  • l465659833
  • 2015年07月14日 20:05
  • 501

正则表达式介绍及常见用法

正则表达式(Regular Expression),又称正规表示法、常规表示法,在实际的软件开发项目中经常会被使用到。它使用单个字符串来描述、匹配并获取一系列符合某个句法规则的结果。...
  • zhouzxi
  • zhouzxi
  • 2016年07月25日 21:52
  • 2454

@RequestMapping用法的简单介绍

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。一下案例是RequestMapping注释常用的两种用法。...
  • fangxinde
  • fangxinde
  • 2017年05月05日 09:56
  • 220

OnClickListener的使用介绍

/***************************************************************************************************...
  • maweifei
  • maweifei
  • 2016年02月22日 11:10
  • 657

DATASTORE应用

DataStore   实际上就是去掉了显示属性的DataWindow   ,如果要说其节约资源也许是可能的,,其用处就应该看你的程序中是否能用的到了,如一个打印表单,就可以建立表单格式的DataSt...
  • bjash
  • bjash
  • 2007年07月08日 17:36
  • 4023

关于Eclipse的基本使用方法

安装JDK1.6具体安装方法如下:1)安装JDK直接双击“jdk-6u10-beta-windows-i586-p.exe”文件,出现许可证协议窗体。单击【接受】按钮,出现自定义安装窗体。单击【下一步...
  • leeshuqing
  • leeshuqing
  • 2009年02月16日 06:44
  • 10214

Linux expect 介绍与用法

Linux expect 介绍与用法 Expect (主页http://expect.nist.gov/) 是用于提供自动交互的工具。比如你要用ssh或者 telnet登录服务器的时候,命令行下...
  • carolzhang8406
  • carolzhang8406
  • 2012年01月09日 14:58
  • 2676

DevExpress控件的使用

目前项目当中一直使用DevExpress控件集,先说一下在gridControl中使用repositoryItemComboBox来模糊查询数据;后面会陆续写一些项目当中使用DevExpress的方法...
  • tzj19810812
  • tzj19810812
  • 2010年01月05日 14:54
  • 1000
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:boost-pool用法介绍
举报原因:
原因补充:

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