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

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

其实main开始之前执行了很多操作如下图○1-○9:
先看看下面的代码:
在这里插入图片描述
代码解读:
后面三行是操作系统的内核,然后调用mainCRTStarup,这是一个c标准库函数,绿色框框里面的就是它做的事情。
1):在这里先讲解_heap_alloc_base(…),看右边小图
如果分配的大小小于等于_sbh_threshold(它是一个常量,大小为1016);
如果大于1016,就用HeapAlloc(…)分配,由此可看出,内存管理主要针对小区块的分配。
2):_heap_init(…)
Windows其实本身维护了海量的内存,用户可以和Windows要求让其分配一块特殊的内存,以后用户分配内存就从这个特殊的内存块取。
如下图:其中_crtheap就是那个特殊的内存,可以把它当作一个指针。
在这里插入图片描述
第一句if(….)如果分配成功就得到了特殊内存_crtheap,紧接着执行__sbh_heap_init(),定义如下
在这里插入图片描述
这个函数主要是为了获得__sbh_pHeaderList,注意HeapAlloc(…),里面有个_creheap,这个就是我们的特殊内存,我们从这个里面获取16个HEADER大小的内存。
在这里插入图片描述
可知道BITVEC是一个32位的整数。其中bitEntryHi和bitEntryLo组成了一个64位的组合,后一个bitvCommit就是最上面的一个32位,其余两个参数就是两个指针。至于后面两个指针所指的内容后面再讲解。

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

猜你喜欢

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