内存池的作用--减少内存碎片
2015-09-28 20:45
316 查看
1 内存池出现的必要性和原因
C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有以下弊端:
调用malloc/new,系统需要根据“最先匹配”、“最优匹配”或其他算法在内存空闲块表中查找一块空闲内存,调用free/delete,系统可能需要合并空闲内存块,这些会产生额外开销
频繁使用时会产生大量内存碎片,从而降低程序运行效率
容易造成内存泄漏
内存池(memory pool)是代替直接调用malloc/free、new/delete进行内存管理的常用方法,当我们申请内存空间时,首先到我们的内存池中查找合适的内存块,而不是直接向操作系统申请,优势在于:
比malloc/free进行内存申请/释放的方式快
不会产生或很少产生堆碎片
可避免内存泄漏
2 内存池的实现
从这里下载该内存池实现的源码。
首先给出该方案的整体架构,如下:
![](http://images.cnblogs.com/cnblogs_com/bangerlee/320012/r_1.jpg)
图1.内存池架构图
结构中主要包含block、list 和pool这三个结构体,block结构包含指向实际内存空间的指针,前向和后向指针让block能够组成双向链表;list结构中free指针指向空闲 内存块组成的链表,used指针指向程序使用中的内存块组成的链表,size值为内存块的大小,list之间组成单向链表;pool结构记录list链表的头和尾。
申请:根据所申请内存的大小,遍历list链表,查看是否存在相匹配的size;
C/C++下内存管理是让几乎每一个程序员头疼的问题,分配足够的内存、追踪内存的分配、在不需要的时候释放内存——这个任务相当复杂。而直接使用系统调用malloc/free、new/delete进行内存分配和释放,有以下弊端:
调用malloc/new,系统需要根据“最先匹配”、“最优匹配”或其他算法在内存空闲块表中查找一块空闲内存,调用free/delete,系统可能需要合并空闲内存块,这些会产生额外开销
频繁使用时会产生大量内存碎片,从而降低程序运行效率
容易造成内存泄漏
内存池(memory pool)是代替直接调用malloc/free、new/delete进行内存管理的常用方法,当我们申请内存空间时,首先到我们的内存池中查找合适的内存块,而不是直接向操作系统申请,优势在于:
比malloc/free进行内存申请/释放的方式快
不会产生或很少产生堆碎片
可避免内存泄漏
2 内存池的实现
从这里下载该内存池实现的源码。
首先给出该方案的整体架构,如下:
![](http://images.cnblogs.com/cnblogs_com/bangerlee/320012/r_1.jpg)
图1.内存池架构图
结构中主要包含block、list 和pool这三个结构体,block结构包含指向实际内存空间的指针,前向和后向指针让block能够组成双向链表;list结构中free指针指向空闲 内存块组成的链表,used指针指向程序使用中的内存块组成的链表,size值为内存块的大小,list之间组成单向链表;pool结构记录list链表的头和尾。
申请:根据所申请内存的大小,遍历list链表,查看是否存在相匹配的size;
相关文章推荐
- hdu5489(2015合肥网络赛F题)
- V字首类破解补丁速查
- 给CSDN的建议(2)
- poj1182
- VEX 常用的函数和语句(一)
- Android 基础5
- Github Hacking
- 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
- 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
- A Quarter-Car Vehicle Model Based Feature for Wheeled and Tracked Vehicle Classification
- 地面机动车辆识别算法的鲁棒性研究
- A Seismic-Based Feature Extraction Algorithm for Robust Ground Target Classification
- 基于出租车GPS记录的地图生成及制动更新算法
- poj1182
- zoj1383题
- Spring下 将父类属性转化为Json属性字段
- Joda-Time Date(jdk) String相互转换
- LEETCODE-Intersection of Two Linked Lists
- nn.MSECriterion()
- android:ViewPager动画摘要