简易内存池

【内存池的引入】
一般的,我们要动态申请内存时,都会调用malloc或new,由于需要申请的内存大小可能预先不知道,所以有时文门会频繁的调用malloc或new,这就大大降低了程序的运行速率,同时还有可能引进内碎片问题。基于上述原因,引入了内存池的概念。
【什么是内存池】
内存池是一种内存分配方式。通俗一点说,内存池就是存放内存的池子。它可以不有效的减少内存碎片化、分配内存时速度更快、并且可以减少内存泄漏等。
通常,内存池会在申请内存前,先申请一个大块的内存以供备用,当真正需要内存时,就去内存池中为其分配一定大小的内存,当分配出去的内存用完之后,不是直接还给系统,而是直接还给为其分配内存的内存池。
【运用内存池机制的好处】
1、由于内存池想系统申请的内存都是比较大块的内存,所以能够降低外碎片问题。
2、内存池一次性分配的内存可以够很多次使用,避免了频繁的向系统申请内存的操作,有效地提高了内存分配效率。
【内存碎片化】
造成堆利用率很低的一个主要原因就是内存碎片化。如果有未使用的存储器,但是这块存储器不能用来满足分配的请求,这时候就会产生内存碎片化问题。内存碎片化分为内部碎片和外部碎片。

内碎片
内部碎片是指一个已分配的块比有效载荷大时发生的。(举个栗子:假设以前分配了10个大小的字节,现在只用了5个字节,则剩下的5个字节就会内碎片)。内部碎片的大小就是已经分配的块的大小和他们的有效载荷之差的和。因此内部碎片取决于以前请求内存的模式和分配器实现的模式。
这里写图片描述

外碎片:
外部碎片就是当空闲的存储器的和计起来足够满足一个分配请求,但是没有一个单独的空闲块足够大可以处理这个请求。外部碎片取决于以前的请求内存的模式和分配器的实现模式,还取决于于将来的内存请求模式。所以外部碎片难以量化。
这里写图片描述

【设计固定大小的内存池】
每个对象的大小固定,每次想系统申请n个对象大小的内存块,如果这n个对象全部被使用,就向系统再申请n个对象大小的内存(n *= 2),用链表的方式挂到上一次申请内存块的后面,使用完的对象快用一个指针维护,以供重复利用。每次申请对象时,优先去最近释放的对象指针中去找,如果没有释放的对象块,才去内存池中去申请。回收内存时,依次将申请的大块内存释放掉即可。

【代码实现】

#pragma once

//设计简易内存池,即固定大小的内存池,也称作对象池
te
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值