C++内存分配总结

内存分配方式:

1、C++内部提供 new/delete malloc/free 来实现内存分配

new malloc 实现内存分配通过维护一个链表来实现对动态内存的管理,链表的每个节点管理一块已分配 或者 未分配的内存单元,在内存分配的过程中涉及到几个步骤 : 遍历链表(或空闲块链表)  -> 根据相应的策略查找内存块 -> 分配或者分割内存块,并重新修改链表;

内存回收的步骤: 查找到要释放的内存块 -> 回收内存块(修改状态) -> 查看相邻的内存块是否未分配,并合并内存块

查找内存块的策略: 首次适应 、 最佳适应 、最坏适应 等等;

缺点:

1、耗时、耗资源, 查找(最坏的情况下要遍历整个链表),分配(分配过之后涉及到 链表的重新整理) 、释放(释放内存块并合并的时候,还需要整理链表) ,维护这个链表的过程是十分耗时,耗资源的。

2、内存碎片,频繁的分配回收之后,内存将形成碎片,这些小的内存碎片可能永远也利用不到,会降低内存的利用率,使程序、系统的性能受到严重的影响。


2、memory pool

首先介绍关于内存池非常优秀的博客:

C++ 内存池 -- C++ Memory Pool

内存池技术

memory pool : 内存池

内存池是一种动态内存分配的方式,我们在实现动态内存分配的时候,习惯上使用 new malloc 等API来申请内存,但是这种分配方式有一定的缺点:用户请求的内存大小是不等的,在频繁的申请与释放之后,会造成大量的内存碎片,这样就降低了内存分配的效率,并造成了浪费,降低了性能

memory pool 的设计原则:

在真正使用内存之前,先申请分配一定数量的、大小相等的(一般情况下)的内存块留作备用,当有新的内存需求时,就在内存池中分出一部分内存块,若内存块不够用,则在继续申请新的内存

这样做显著的优点: 尽量避免内存碎片,使得内存分配效率提升,内存利用率增加。

使用一个链表结构的内存管理单元来管理内存,使用内存池的策略,会形成这样的一个结果,设最小的内存分配单元 8KB,我们可以预分配 (x,8KB) 、(y,16KB)、(z,24KB) 等等的内存块,组成一个二维链表结构来管理这些内存块,方便对响应的用户的请求分配内存块:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值