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) 等等的内存块,组成一个二维链表结构来管理这些内存块,方便对响应的用户的请求分配内存块: