STL alloc分配内存原理

图片来自侯捷老师的课程

alloc

(1)分配器分配内存,#0号分配8字节,#1号分配16字节,#2分配24字节,以此类推…

在这里插入图片描述

(2)每次分配出20个块来存储数据,再额外分配20个块作为备用池
在这里插入图片描述(3)需要字节不一样时(此时需要64字节),从备用池切割,从20块变为10块来适配64字节大小。

在这里插入图片描述(4)无备用池可用,调用malloc获得内存,Roundup(1280>>4)是追加量,每一次分配都会多一些,设计团队的想法,个人不是很理解,但猜测是为了足够多的备用空间考虑。
在这里插入图片描述
(5)88字节的容器可以直接使用备用池,备用池余下240字节,此时共有4个不同大小的容器,调用了两次malloc(两个cookie)
在这里插入图片描述
(6)容器申请88个字节空间
在这里插入图片描述(7)分配8字节大小
在这里插入图片描述
(8)新的容器申请104字节大小,备用池(80)不满足最小需求,那么为了防止产生内存碎片,此块内存交给#7来处理。
在这里插入图片描述
(9)新容器继续申请112字节大小,备用池够用。

在这里插入图片描述

(10)新容器申请48字节大小,备用池分出3块,还剩24字节大小。

在这里插入图片描述(11)模拟超出堆空间情况,system heap设为10000。

此时申请72字节的空间必然失败(72* 20 *2),因此向比#8(72byte)大的区号去借空间,发现#9号区块有之前的一块内存碎片(80byte),利用此块空间分出一块72字节空间给容器,还剩8字节的一块备用池,由#8指向此备用池。

在这里插入图片描述
(12)接上,继续给容器分配72字节大小
备用池只剩8字节不足分配,此块8字节块作为内存碎片交给#0管理。

向后继续借空间,发现#10区号(88字节)有空闲块,借走72字节空间存放新容器数据(72byte),剩下16字节作为备用池(#8指向此块),#10区块的指针下移一个单位(88字节)。

在这里插入图片描述(13)新申请120字节空间,先找#14区块,没有可用空间,向右找发现#15也没有可用空间,此时山穷水尽了,申请内存失败。
在这里插入图片描述
(14)接上,分配失败时,思考两个问题
1.从图中看出还有很多内存块没用到,是否可以利用到? 理论可以,实现极其困难。

2.利用system heap中剩余空间资源(10000-9688=312)? 貌似没有必要,锤死挣扎,不如优雅的死去。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值