【C++生前死后】生前做了什么

目录

 

1.StartUpCode在哪?

2.VC6.0的调用栈

2.0总览

2.1_heap_init() 

2.2 ioinit()


 

 

1.StartUpCode在哪?

以VC6.0为例.

2.VC6.0的调用栈

2.0总览

VC6.0

VC6_heap_init()

1._heap_init(...)
  __sbh_heap_init()--小区块的管理,sbh--small block heap
2._ioinit()
3.GetCommandLineA()
4._CRTGetEnvironmentStringsA()
5._setargv()
6._setenvp()
7._cinit()
8.main()
9.exit(code)


heap_alloc_base()--如果需要的大小小于_sbh_threshold的话,就用_sbh_alloc_block(size)去
申请内存,如果是大于这个门槛就用HeapAlloc来申请内存.
在VC6.0中,这个门槛的长度是3F8,十进制下就是1016.
为什么是1016这个奇怪的数字呢?因为大小在调用的过程中不断变化不断膨胀.
其实启动代码中设置的sbh是要应付CRT本身以及main进去之后的所有的内存分配.

问题:在Linux中是如何做的呢?


后序关注:00000131+中间那8个+草绿色块fill with 0xcd+fdfdfdfd+00000131是干啥的?
这个是调试模式下做的.如果非调试模式就不会有那九格.老师现在说的都是调试模式下的.
所以C++程序在调试模式下其实每一块内存都是长成那样的.
疑问:这块内存多大?是什么内存?


00000131--是cookie,1016+两块cookie正好是1024.(完美)
windows本来就提供了两个层次的heap的管理.
低阶的那个是virtual alloc,比较高阶一点的是图中的HeapAlloc.
按道理说这两个内存管理足够了,但是VC6.0还增加了一种对特别小的内存的特殊处理.

总结:
对于VC6.0大小内存申请有两种不同的处理方式,小的用_sbh_alloc_block,大的用HeapAlloc.



作业系统(台湾)--操作系统(大陆)

注意留意本页ppt中的内存块:
(1)从哪里来?--小于_sbh_threshold,调用_sbh_alloc_block;大于_sbh_alloc_block,用HeapAlloc;
(2)大小几何?--调试模式下会膨胀(这里还需再理解一下,是申请多少算多少,调试模式下会膨胀吗?)
(3)回收到哪里?--后面再解开神秘的面纱.

2.1_heap_init() 

 

 

 

启动代码的第一个动作是_heap_init(),
_heap_init()--这个函数里面建立了一个池塘,并且从这个池塘里面挖出16个Header,准备等一下
要用.这个也是_heap_init()的全部动作.
在32位操作系统下,一个Header的大小是20个字节.16个Header就是320个字节.

总结一下:
申请了4096个字节,其中320个字节被用于存储Headers,还剩下3776个字节.
(我自己的总结,未验证)

2.2 ioinit()

应用程序员各显神通的地方是在main()里面,启动码是不能改的.
老师说任何一个C++应用程序的第一次分配内存大小是ioinit()里面的256个字节,(P5-5:12,这个对吗?)
问题:在_heap_init()里面HeapCreate()函数没有分配内存吗?

ioinit()里面的256个字节用作IO初始化.就是那个100h(h代表16进制).
调试模式下,要加上上下这些东西,加完之后的长度要登记在cookie之中,
就是0000131那里,加加看:
100h(256)
+24h(36)
+8h(8)
=12ch(300)----调到边界(字节对齐),16进制调到边界后面那个一定是0,120c往上调就是130h---图图又又画错了,少了一块填补的地方.--(P5--7:20--21:29)
=130h(304)
疑问:这里是以8个字节对齐的吗?还是16字节对齐的?为啥?如果是8字节的话要加的话也是在24h和8h
后面加对吗?老师说是加在哪的?
老师说的不太理解.
malloc_dbg()
_nh_malloc_dbg()
...
__sbh_alloc_new_group
这些函数有一些都会导致内存膨胀一点(申请内存),一些函数会加cookie,还有一些函数会调到16的边界,
于是得到了这样的结果,整块是130h这么大.但是对于ioinit()这个函数,它最关心的是100h那块内存.
所以ioinit()返回的指针将会执行100h那块内存的起始地址.其他地方都是管理的时候用的.
谁在管理呢?heap.(或者所谓的sbh,小区块管理器管理的是额外的信息)

 

3.VC10的调用栈

 

 

对于VC10表面上看对于SBH(small block heap)没有处理,实际上已经将对小块的处理封装到HeapAlloc中
了.老师咋敢这么说呢,又有操作系统的代码呢?此时不是用源代码来表现了,后面会用专门的一块来说这
个HeapAlloc到底做了啥.那时也许你和我就会恍然大悟,拭目以待吧.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值