boost及其子库pool内存池的使用
2015-09-17 19:15
399 查看
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. 三种内存的分配方式的比较,找到理想的内存分配方式?
比较代码如下:
比较结果分析如下:
(1)集中分配指针移动的方式是最理想的,但是该方法的不足之处是需要开发者一步步的进行内存运算,计算时一定要谨慎,避免错误;
(2)利用内存池比多次能态分配释放性能更优,因为每一次在堆上的资源分配都需要消耗时间,而且容易造成内存碎片,降低内存的利用率。
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)利用内存池比多次能态分配释放性能更优,因为每一次在堆上的资源分配都需要消耗时间,而且容易造成内存碎片,降低内存的利用率。
相关文章推荐
- 2016中科院推免
- reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xbffffffffffff9a3
- Javascript 继承的六种方法
- CSS3文本
- Maven 项目关于 plexus-utils:jar的错误解决
- 项目三——求集合并集
- 安卓中sqlite数据库的增删改查操作的工具类
- CSAPP读书笔记——程序的机器级表示之栈帧结构
- OpenWrt-LuCI 路由器设置端口映射(RDP & SSH)
- Mysql数据库的内外联查询
- poj 1703
- CSS3文本溢出
- Android推荐书目文章(实时更新....)
- 算法导论 使用两个队列实现一个栈
- UIday1801:沙盒三个文件的路径的获取、简单与复杂对象的读写、NSUserDefaults、NSFileManager
- 美团霸面---我想说说心里话。
- 【转】android fragment 博客 学习
- machine learning(12) -- classification: One-vs-all classfication
- 如何利用 JConsole观察分析Java程序的运行,进行排错调优
- 面向对象编程,类切换