侯捷C++八部曲笔记(六、C++程序的生前死后)

  • startup code
  • HeapCreate
  • 总结
    • main执行之前
    • main执行之后

生前:CRT startup code

看完课程,能够回答一下问题:

  1. C++进入点是main()嘛?
  2. 什么代码比main更早执行?
  3. 什么代码在main结束后执行?
  4. 为什么上述代码可以如此行为?
  5. Heap的结构如何?
  6. I/O的结构如何?

startup code

有一个启动代码:就是指定/ENTRY:function (Entry Point Symbol),他是一个function,函数的调用形式,返回值都有规定。需要完成的事:初始化CRT library,初始化静态对象。

main应该由启动代码来调用。

在使用gcc编译,-e参数用于指定启动函数。

还记得内存管理中的内存分配的具体步骤嘛?

在内存管理部分,我们只关注前面两个函数,他们完成指定的内存分配策略。

  1. _heap_init(): 内存heap初始化。内存管理那一节我们已经讲过,是做16个header初始化工作。
  2. _ioinit():IO初始化,malloc分配256k大小(过程很复杂,见内存管理那个部分),用于IO初始化。比如初始化stdin(0)、stdout(1)、stderr(2)等东西(最多分配2048个文件描述符),不太感兴趣哦。

environ是pointer to pointer table,table中的每个entry都是代表环境变量的pointer to string,如下图:

也就是要得到main函数的参数,包括:__argc,__argv,_environ。其中的_environ中的内容就是startup code想要得到的,一般由操作系统持有,程序需要把这个信息从操作系统copy过来,所以分配内存来存放这些信息。环境变量具体的内容如下:

  1. GetCommandLineA(): 处理一个字符串。
  2. __crtGetEnvironmentStringsA(): 处理一堆字符串
  3. _setargv(): 命令行的参数
  4. _setenvp(): 引发11次内存分配,也就是上面说的,将操作系统持有的环境变量复制到程序中来,需要内存来存放。
  5. _cinit():

上面的3-7步骤的详细内存分配计算图如下,每个分配的内存大小都需要膨胀,加debug信息32bytes,加cookie 8bytes,都是在由ioinit申请的内存中分配的:

HeapCreate

前面说到,小于1k的内存交给SBH来分配,其余的内存交由操作系统来分配,也就是HeapCreate来处理。

有128条链表用于管理内存分配,设计思想和SBH内存分配是一样的,只不过能分配的内存更大,对应的cookie只有上cookie,上cookie中存放当前块大小,前一个区块大小,单位为单元(一个单元8byte),而不是字节。

总结

main执行之前

  1. 设置栈指针:为栈分配相关的位置,用来放一些局部变量和其他数据
  2. 初始化static静态和global全局变量,即data段的内容:把全局和静态变量初始化,放在相应的位置
  3. 将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容:将未设置初值的全局变量赋初值
  4. 全局对象初始化,在main之前调用构造函数
  5. 将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数:argc为整数,argv为指针的指针

main执行之后

执行全局的析构函数,可以用_onexit 注册一个函数,它会在main 之后执行; 。

侯捷C++八部曲笔记(六、C++程序的生前死后)相关推荐

  1. 侯捷C++八部曲笔记(四、C++2.0新特性)

    侯捷C++八部曲笔记(四.C++2.0新特性) 关键字 noexcept override final decltype =default, =delete nullptr auto explicit ...

  2. 侯捷C++八部曲笔记(五、内存管理)

    侯捷C++八部曲笔记(五.内存管理) 表达式new.delete 基本用法 array new.array delete replacement new ----------------------- ...

  3. 灵飞经4·西城八部 第十六章 风流云散 6

    待他睡熟,乐之扬退出云房,才回头,忽见道清守在门外,见了他眉开眼笑,伸出一手,扯住说道:"道灵师弟,我等你好久了." 乐之扬心跳加快,忙说:"观主好,小道怎敢和您老兄弟相 ...

  4. 灵飞经4·西城八部 第十六章 风流云散 3

    席应真见他一脸茫然,问道:"你想什么?" 乐之扬迟疑 "这件事,她.她怎么一个字也没有提过?" 席应真笑了笑,问道:"跟你说了,你又如何? " ...

  5. 解题报告:SP1043 GSS4 - Can you answer these queries III(GSS线段树八部曲之三)(区间最大连续子段和)

    要注意输入的数据有坑,x可能大于y- 我们可以模块化编程,使得整个代码井井有条 函数可以重名,只要参数不一样就行. 来源 yxc老师的上课板书 然后就是简单的代码了 #include<iostr ...

  6. 解题报告:SP2713 GSS4 - Can you answer these queries IV(GSS线段树八部曲之四)

    x>yx>yx>y是真的艹. 然后就是一道模板题了. #include<bits/stdc++.h>using namespace std; typedef long l ...

  7. 灵飞经4·西城八部 第十六章 风流云散 2

    是日住在农家,乐之扬带飞雪去村外捕猎.白隼小逞威风, 不一会儿就捉到了三只野兔.乐之扬提着猎物凯旋,到了住所外 面,忽见叶灵苏坐在树下,凝神看着什么,有人来了也没知觉.乐之扬望她背影,起了顽皮心思,放 ...

  8. 灵飞经4·西城八部 第十六章 风流云散 4

    乐之扬无奈,掉转马头,一阵风来到蒋山脚下.远远看去, 青瓦玄宫,高出浓萌之上,汉白玉道,直通极峨山门,山门上玉匾鎏金,写着"敕建阳明观"五个御笔大字. 阳明观隶属皇家,不许闲人靠近 ...

  9. 灵飞经4·西城八部 第十六章 风流云散 5

    冷玄离开以后,梁思禽传书给我,告知一切.我那时正在京城,看了信十分担心,于是报与朱元璋.后者却很镇定,笑着说:'这也有趣,寡人很想看一看,这个元朝大汗的太监,有什么了不起的本事.'他说得容易,我却不敢 ...

最新文章

  1. 在云中利用开源软件进行开发以提高创新能力
  2. C#自定义工业控件开发
  3. 【机器学习基础】数学推导+纯Python实现机器学习算法13:Lasso回归
  4. GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)
  5. CSS3 Flex 弹性布局用法详解
  6. GP学习整理(一)—Geoprocessing assembly and Geoprocessor managed assembly
  7. 使用反射复制一个JavaBean的对象
  8. mysql ERROR 1396 (HY000): Operation CREATE USER failed 解决办法
  9. 【渝粤教育】电大中专电商运营实操 (13)作业 题库
  10. Go语言实战 (William,Kennedy 等著)
  11. 【成像】【7】太赫兹光学——光学元件和子系统
  12. js html post提交表单,JS动态创建表单post提交
  13. 【ionic框架bug】slidebox在使用model或popover后width变为0的解决方案
  14. 网页换肤--setAttribute - css
  15. 企查查爬虫python实现(一)整体方法
  16. 用Jplayer做的一个带动画的播放器
  17. NYoj21 三个水杯
  18. excel表格拆分如何快速完成
  19. Eureka工作原理(Eureka简介Eureka ServerEureka Client自我保护机制分布式系统中的CAP理论Eureka 工作流程)
  20. Android之检测外网连接性(ping)

热门文章

  1. 为什么很多初中生只用QQ,而不用微信
  2. H5页面长按截图+保存页面截图到本地功能
  3. UnderRun和OverRun
  4. 广东省智慧城市建设历程及现状——以中山市为例
  5. 得到专栏-生命科学50讲-思维方式研究
  6. MySQL盈利_个人网站如何盈利
  7. 情商是怎样提高起来的?
  8. Robot Framework RIDE闪退问题
  9. mysql truncate delete 释放磁盘空间
  10. 员工管理系统(练习打卡~)