![](https://csdnimg.cn/release/download_crawler_static/86281791/bg1.jpg)
文章编号
:
1004 - 5422( 2017) 03 - 0257 - 05
基于
C ++
的高效内存池的设计与实现
鄢 涛
1,2
,
于 曦
1,2
,
刘永红
1,2
,
赵卫东
1,2
,
余 悦
1
,
曾 谊
1
( 1.
成都大学 信息科学与工程学院
,
四川 成都
610106;
2.
成都大学 模式识别与智能信息处理四川省高校重点实验室
,
四川 成都
610106)
摘 要
:
为了高效
、
安全地利用计算机内存资源
,
在大型的软件设计中
,
往往要进行大量的内存分配与回收操
作
,
为此
,C ++
专门提供了
malloc
等相关函数进行操作
,
这些函数能够满足一般的使用
,
但由于它们调用了操
作系统
API,
所以实际使用时会在 操作系统中产生大量的内存碎片
,
让内存分配成为效率瓶颈
,
从而降低系统
性能
.
基于此
,
通过对循环首次适应算法进行改进
,
设计并实现了基于
C ++
的高效内存池
,
大幅提升了内存分
配与回收的效率
.
同时
,
还为内存池编写了相关的分配子
,
使其能与
C ++
标准库无缝对接
,
提供了若干具有垃
圾回收功能的智能指针
,
提高了内存管理与程序运行的效率
.
关键词
:
内存池
;
内存分配
;
循环首次适应算法
;
高效策略
中图分类号
: TP311. 11
文献标志码
: A
0
引 言
大型的计算机软件应用中
,
往往需要进行大量
的内存分配与回收工作
,
这些工作可以通过各种内
存分配函数来完成
,
比如
C
语言的
malloc.
但由于操
作系统在分配内存时
,
需要进行大量的查找工作
,
所
以使用如
malloc
来分配内存实际上是比较低效的
.
不仅如此
,
由于分配算法本身的问题
,
多次的内存分
配
/
回收还会产生大量系统级别的内存碎片
,
进而降
低内存的利用率
.
针对这些问题
,
内存池将会是一个
很好的解决方案
,
内存池实际上是一种缓冲的机制
,
它一次性申请大量内存
,
以后每当有内存分配请求
时
,
不再调用
malloc
这样的函数
,
而是在内存池中
寻找一片合适的区域来使用
.
目前
,
基于
C ++
的内存池设计与实现有不少
方案
,
其中最为优秀的当属准标准库
Boost
提供的
boost: : pool
和
boost: : object
-
pool,
前者用于储存各
种基本 数 据
,
后 者 用 来 储 存 各 种类 的 实 例 对 象
.
Boost
是一个重量级的库
,
安装和配置非常繁琐
,
虽
然
boost: : pool
在分配指定大小的内存时很高效
,
但
是在分配任意大小的 内存时
,
却显得比较笨拙
.
在某
些应用场景下
,boost
中的内存池不能完美满足开发
的需求
.
基于此
,
本研究设计并实现了一款高性能且
轻量级的内存池
.
比起已有的研究成果
,
本研究的最
终方案不仅拥有让使用者满意的分配效率
,
而且还
能提供很多方便开发 者利用的内存池辅助工具
.
1
数据结构设计
1. 1
内存池对象设计
内存池对象的设计要解决的首要问题就是内存
池类的维护和管理
,
具体为
:
首先需要提供至少
2
个
接口
: allocate
和
deallocate,
分别负责内存分配与回
收工作
;
然后是内存资源的维护
,
大多数内存池的实
现
都会采用链表
,
有所不同的是本研究所维护的链
表的基 本 结 点 并 不 是 内 存
,
而 是
“
内 存 池 结 点 对
象
" ,
这些结点又各自维护着自己的内存块
.
采用这
种模式
,
能最大限度地减小内存池各个组件之间的
耦合性
.
由于内存池的创建和销毁都需要消耗大量的资
源
,
所以不妨在这个设计中利用单例模式来防止用
户创建过多的内存池对象
.
单例模式是一种最简单
的设计模式
,
只需要把构造
/
析构函数设置为私有
,
然后提供一个静态函数作为接口即可
.
此外
,
还需要
若干个成员变量
,
分别表示链表头
、
链表尾
、
当前结
点等
.
内存池类的签名如下
,
class memPool final
{
public:
void * allocate( size
-
t) ;
收稿日期
: 2017 - 08 - 12.
基金项目
:
四川省科技厅软件科 学研究计划
( 2017ZR0198) 、
四川省科技厅应用基础计划
( 2016JY0255)
资助项目
.
作者简介
:
鄢 涛
( 1973 — ) ,
男
,
硕士
,
副教授
,
从事计算机软件工程研究
.