c++内存管理12-winmain/main之前你所不知道的事04

本文深入探讨了Windows环境下内存分配机制,解析__sbh_heap_init()如何获取16个headerlist链表,每个header负责1mb内存分配,通过virtualalloc实现。详解了region在内存管理中的角色及其成本。

winmain/main之前你所不知道的事04

上面的设计其实都是纸上谈兵而已,只是计算大小。接下来才是真真的分配内存。
前面我讲了__sbh_heap_init()的主要作用就是为了获取16个headerlist链表。每一个header负责1mb大小,它会调用Windows下的virtual alloc.
需要注意的是每个headerlist有两个指针,其中一个指针指向真正的内存,另外一个指向内存管理中心。如下,右边就是一个管理,叫作region.
在这里插入图片描述
右边这个图是侯捷大神通过观察region设计而画的。
现在我解释下,右边其中几个参数的作用
BITVEC bitvGroupHi[32]
BITVEC bitGroupLo[32]
前面我提过,带Hi和Lo的两个32位会拼成一个64位的数,那在这里就会有32组64个数,它的主要作用是管理某一个区块有或者没有,链表里面的一些小细节。如图上图所示。
Struct tagGroup grpHeadList[32]
如图所示就是Group0Group31,其中包含的内容如图右边。
值得注意的是结构体LISTHEAD,它有两个指针分别是pEntryNext和pEntryPrev;也就是说每个group包含64对双向链表。
总结:一个header将申请固定大小的内存,将来切割内存是从最右边(如图)切割的。为了管理这个固定大小的内存而出现了region。但这个内存管理是需要成本的,region的大小大约是16k.也就是说为了管理1MB内存大小花费了16k的成本。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值