关于boost库里的内存池pool

内存池是一种可以提高程序效率的一种途径,内存是提高的地方就是一次申请一块较大的内存,在你后面使用的时候就直接在申请好的内存中申请使用即可,省去了每次单独申请空间时间。也避免了内存碎片,当申请的内存足够大,在使用的时候函数中申请内存迟里的内存时候,如果申请的空间牛才能没有用完,剩下的内存会通过自有链表链接起来,已备后面使用,在程序最后析构pool对象的时候会调用析构函数释放内存池所有空间。下面我们先宏观来看看内存池的使用和大概框架:

1.boost库里内存池pool的使用:

//pool是在boost库里,需要引入boost库头文件,下面通过使用库里的pool
#include<iostream>
#include<boost/pool/pool.hpp>
#include<boost/pool/object_pool.hpp>
#include<boost/pool/singleton_pool.hpp>
#include<boost/pool/pool_alloc.hpp>
#include<assert.h>
using namespace std;
using namespace boost;

int main()
{
    pool<> pl(sizeof(int)*10);//实例化内存池对象,sizeof(int)告诉构造函数以整型数据大小来构造对象
//告诉系统每次申请按多大的块来申请,系统会在第一次申请时候划分好大小给返回也会在下次同样的申请的时候直接给返回提高了效率
    /*
    explicit pool(const size_type nrequested_size,
        const size_type nnext_size = 32,
        const size_type nmax_size = 0)
    :list(0, 0), requested_size(nrequested_size), next_size(nnext_size), start_size(nnext_size),max_size(nmax_size)
    { }
    */
    int *q = (int*)pl.malloc();
    *q = 10;
    cout<<*q<<endl;
    assert(pl.is_from(q));
    pl.free(p);

    int *p = (int *)pl.ordered_malloc(10);//看上面的就是内存池构造函数,就能明白为什么能申请十个空间
    for(int i = 0; i<10; ++i)
    {
        p[i] = i+1;
    }
    for(int i=0; i<10; ++i)
    {
        cout<<p[i]<<"   ";
    }
    cout<<endl;
    assert(pl.is_from(p));
    pl.ordered_free(p);
    pl.release_memory();//释放没有用到的内存池空间
    return 0;
}

2.boost库里内存池里pool的框架:

这里我们对pool的大致框架进行简单的分析,如下:

template<typename UserAlloctor = ...>//UserAlloctor是用户定义的内存缓存器,用户也可以不给
class pool
{
public:
    explicit pool(size_type requested_size);//requested_size指示每次pool分配内存块的大小(而不是pool内存池的大小)

    ~pool();
    size_type get_requested_size()const;
    //从内存池里申请空间方法
    void * malloc();//系统调用内部函数malloc_need_resize(),计算需要空间大小
    void * malloc(siz_type n);
    void * ordered_malloc();//调用内部函数
    void * ordered_malloc(size_type n);

    bool is_from(void * chunk) const;//判断内存是否来自内存池,在释放空间的时候需要先进性判断

    //把内存归还给内存池
    void free(void * chunk);//匹配malloc,用来是释放malloc申请的内存池空间
    void ordered_free(void * chunk);//匹配ordered_malloc,用来释放ordered_malloc申请的内存池空间

//将空间归还给系统
    bool release_memory();//把内存池里未被分配的空间归还给系统,分配了的不是影响
    bool purge_memory();//强制把内存池里的所有空间释放,包括分配了的空间
};

这里的申请空间和释放空间和我们在C语言中的malloc用法一样,这里我们来看看chunk函数的机制,也是pool核心管理申请到的内存机制,后面我们对boost库里的pool代码进行详细的分析,在这里主要讲解pool大致使用和框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值