boost之pool

  • 头文件
    • #include ”boost/pool.hpp“
  • 笔记
    • 对于频繁分配及释放大量固定大小的小内存的操作可以用pool来实现,pool接口保证没有内存泄露。
    • pool有两个分配器:
      • pool_allocator : 用于任意数量的连续块。
      • fast_pool_allocator: 用于一次只分配一块的场景。也可以用于一次分配任意数量的连续块,但是效率没有pool_allocator好。
    • pool不需要编译,只要引用头文件就可以使用。
    • 对于内存池的使用分为两种方式:
      • 按照一般对象的方式使用pool,在销毁pool对象的时候同时也会销毁由它分配的内存。
      • 按照单例方式,单例方式中,pool对象是共享的,单例的pool也是线程安全的。由单例方式的pool分配的内存需要通过release_memory()或者purge_memory()来释放。否则内存就会等到程序退出导致单例pool被销毁后才会被释放。
    • 接口出错会返回0,尽量不抛出异常。
    • 使用pool时需要引用命名空间 boost::details::pool
  1. template<typename UserAllocator = ... >  
  2. class pool  
  3. {  
  4. public:  
  5.     //接受一个size_type类型的整数,指示每次分配内存块的大小(不是内存池的大小)  
  6.     explicit pool(size_type requested_size);  
  7.     ~pool();  
  8.     //返回requested_size  
  9.     size_type get_requested_size()const;  
  10.   
  11.     //用void*指针返回从内存池中分配的内存块,大小为requested_size,如果分配失败返回0,不会抛出异常  
  12.     void * malloc();//从内存池中任意分配一个内存块  
  13.     void * ordered_malloc();//分配的同时合并空闲块链表  
  14.     void * ordered_malloc(size_type n);//连续分配n块内存  
  15.     bool is_from(void * chunk)const;//测试chunk是否是从这个内存池分配出去的  
  16.   
  17.     /*下面的函数一般都不应该由程序员调用*/  
  18.     //一般情况下内存池会自动管理内存分配,不应该调用free(),除非内存池空间已经不足,必须释放已经分配的内存  
  19.     void free(void *chunk);  
  20.     void ordered_free(void * chunk);  
  21.     void free(void *chunk,size_type n);  
  22.     void ordered_free(void *chunk,size_type n);  
  23.   
  24.     //让内存池释放所有未被分配的内存,但已分配的内存块不受影响  
  25.     bool release_memory();  
  26.     //强制释放pool持有的所有内存,不管内存块是否被使用,析构函数就是调用的purge_memory()  
  27.     bool purge_memory();  
  28. };  
  • 再看pool 构造函数:
1     explicit pool(const size_type nrequested_size,
2         const size_type nnext_size = 32,
3         const size_type nmax_size = 0)
  • 第一个参数是每次申请的chunk的大小,第二个参数首次申请内存时一次分配的chunk的个数,下次pool在内存不足时会自动申请内存,申请数量翻倍,第三个参数一个block中最多的chunk数目,第二个参数不能大于它,如果为0,就没有限制了。
  • pool中的free函数一般不需要程序员调用,在pool析构的时候会自动释放其所管理的内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值