VC6和VC10的malloc比较

调用栈,从下往上
mainCRTStartup函数是CRT(C Run Time,C标准库)提供的入口点函数 ,调用一系列函数,后面才是调用main函数
_heap_alloc_base函数,当size小于一个阈值_sbh_thrshold时调用__sbh_alloc_block函数,否则调用HeapAlloc函数,后者是操作系统提供的内存分配函数

不再做门槛检测,无论多大内存,都交给操作系统申请,对于VC10版本,它的SHB等小块内存的管理都被包装到HeapAlloc里面来了。

_heap_init里面调用HeapCreate来分配一块大小为4096的堆空间,命名为_crtheap,后面CRT的动作都要从这一块内存中来拿
_heap_init里面调用__sbh_heap_init,里面时HeapAlloc,从_crtheap中拿内存,准备好16个header
所以 _heap_init的作用就是准备好16个header

其中的一个head结构,hi和lo组合共64位,下面一行,commit32位是上面一行
vc6内存分配

CRT进行的第一次内存分配,调用了_malloc_crt进行内存分配。分配的大小为32 x 8 = 256B,所有的程序一进来都是分配256B。256在十六进制下是0x100,或者写成100H
_malloc_dbg 是与调试相关的内存分配函数,它是 Microsoft Visual C++ 提供的一种扩展版本,用于在调试模式下进行内存分配,并提供额外的调试信息

之后调用_heap_alloc_dbg,里面右下角计算blockSize的时候,_CrtMemBlockHeader是一个结构体,可以称为debug header,nSize就是上文提到的256B,后面的nNoManLandSize是4

_pFirstBlock和_pLastBlock两根指针指向block链表的头尾。malloc分配的内存块都用链表串起来
调试模式下多了(右上图)深灰色之外的东西
上图右下角的memset是给特定地方填入特定的值

_heap_alloc_base分配内存,把刚刚扩充的大小在去比较,小于阈值的内存交给sbh服务,大于阈值的内存交给操作系统HeapAlloc来服务。
这里_Sbh_threshold的值是1016,因为还没有加cookie(大小为8),两者加起来是1024B

在前面block的大小(intSize)基础上,上下添加cookie(2*sizeof(int),以及右侧上下两块红色的地方0x131)。(BYTE_P

最低0.47元/天 解锁文章
757

被折叠的 条评论
为什么被折叠?



