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

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的成本。

发布了65 篇原创文章 · 获赞 6 · 访问量 1532

猜你喜欢

转载自blog.csdn.net/FairLikeSnow/article/details/103951243