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

1. 什么是boost库?

boost库是一个可移植并提供噢乖源代码的C++库,是标准库的后备库,是C++标准化开发进程之一。

boost库是为C++语言标准库提供扩展的程序库总称。

2. boost程序库的下载与安装:

http://www.boost.org/

http://jingyan.baidu.com/article/11c17a2c765763f446e39dc1.html(按照步骤,很清晰,觉得百度经验非常给力!)

3. 什么是内存池?为什么要使用内存池?

内存池(Memory Pool)是一种动态内存分配与管理技术。

通常情况下,程序员习惯直接使用new、delete、malloc、free等API申请分配和释放内存,导致的后果时:当程序长时间运行时,由于所申请内存块的大小不定,频繁使用时会造成大量的内存碎片从而降低程序和操作系统的性能。内存池则是在真正使用内存之前,先申请分配一大块内存(内存池)留作备用,当程序员申请内存时,从池中取出一块动态分配,当程序员释放内存时,将释放的内存再放入池内,并尽量与周边的空闲内存块合并。若内存池不够时,则自动扩大内存池,从操作系统中申请更大的内存池。

Boost拥有一个现成的内存池pool库,可被轻便拿来使用,故在这里检验其性能,以便往后的恰当使用。

4. 三种内存的分配方式的比较,找到理想的内存分配方式?

比较代码如下:

#include <iostream>
#include <ctime>
#include <malloc.h>
#include <Windows.h>   
#include <stdlib.h>
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp>
#define _ALIGN_ 16
#define MEM_SIZE 1000*sizeof(int)*2

using namespace std;
using namespace boost;

const int MAXLENGTH=10000;

int main()
{
	pool<> p(sizeof(int));
	int* vec1[MAXLENGTH];
	int* vec2[MAXLENGTH];

	clock_t clock_begin=clock();
	for(int i=0;i<MAXLENGTH;++i)
	{
		vec1[i]=static_cast<int*>(p.malloc());
	}
	for(int i=0;i<MAXLENGTH;++i)
	{
		p.free(vec1[i]);
		vec1[i]=NULL;
	}
	clock_t clock_end=clock();
	cout<<"pool分配释放运行了:"<< clock_end-clock_begin<<"个系统时钟"<<endl;

	clock_begin=clock();
	for(int i=0;i<MAXLENGTH;++i)
	{
		vec2[i]=new int[1];
	}
	for(int i=0;i<MAXLENGTH;++i)
	{
		delete vec2[i];
		vec2[i]=NULL;
	}
	clock_end=clock();
	cout<<"动态分配运行了:"<< clock_end-clock_begin<<"个系统时钟"<<endl;

	unsigned char *vec3;
	unsigned char *ptr;
	int* vec4[MAXLENGTH];
	vec3=(unsigned char*)_aligned_malloc(MEM_SIZE*sizeof(unsigned char),_ALIGN_);
	ptr=vec3;
	clock_begin = clock();
	for(int i=0;i<MAXLENGTH;++i)
	{
		vec4[i]=(int*)(((unsigned int)ptr+_ALIGN_-1)/_ALIGN_*_ALIGN_);
		ptr+=(sizeof(int)+_ALIGN_-1)/(_ALIGN_*_ALIGN_);
	}
	_aligned_free(vec3);
	clock_end=clock();
	cout<<"集中分配指针移动运行了:"<< clock_end-clock_begin<<"个系统时钟"<<endl;
	return 0;
}


比较结果分析如下:

(1)集中分配指针移动的方式是最理想的,但是该方法的不足之处是需要开发者一步步的进行内存运算,计算时一定要谨慎,避免错误;

(2)利用内存池比多次能态分配释放性能更优,因为每一次在堆上的资源分配都需要消耗时间,而且容易造成内存碎片,降低内存的利用率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值