您的位置:首页 > 其它

关于boost库里的内存池pool

2017-06-20 11:07 330 查看
内存池是一种可以提高程序效率的一种途径,内存是提高的地方就是一次申请一块较大的内存,在你后面使用的时候就直接在申请好的内存中申请使用即可,省去了每次单独申请空间时间。也避免了内存碎片,当申请的内存足够大,在使用的时候函数中申请内存迟里的内存时候,如果申请的空间牛才能没有用完,剩下的内存会通过自有链表链接起来,已备后面使用,在程序最后析构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大致使用和框架。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息