侯捷C++八部曲笔记(六、C++程序的生前死后)
侯捷C++八部曲笔记(六、C++程序的生前死后)
- startup code
- HeapCreate
- 总结
- main执行之前
- main执行之后
生前:CRT startup code
看完课程,能够回答一下问题:
- C++进入点是main()嘛?
- 什么代码比main更早执行?
- 什么代码在main结束后执行?
- 为什么上述代码可以如此行为?
- Heap的结构如何?
- I/O的结构如何?
startup code
有一个启动代码:就是指定/ENTRY:function (Entry Point Symbol),他是一个function,函数的调用形式,返回值都有规定。需要完成的事:初始化CRT library,初始化静态对象。
main应该由启动代码来调用。
在使用gcc编译,-e
参数用于指定启动函数。
还记得内存管理中的内存分配的具体步骤嘛?
在内存管理部分,我们只关注前面两个函数,他们完成指定的内存分配策略。
- _heap_init(): 内存heap初始化。内存管理那一节我们已经讲过,是做16个header初始化工作。
- _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过来,所以分配内存来存放这些信息。环境变量具体的内容如下:
- GetCommandLineA(): 处理一个字符串。
- __crtGetEnvironmentStringsA(): 处理一堆字符串
- _setargv(): 命令行的参数
- _setenvp(): 引发11次内存分配,也就是上面说的,将操作系统持有的环境变量复制到程序中来,需要内存来存放。
- _cinit():
上面的3-7步骤的详细内存分配计算图如下,每个分配的内存大小都需要膨胀,加debug信息32bytes,加cookie 8bytes,都是在由ioinit申请的内存中分配的:
HeapCreate
前面说到,小于1k的内存交给SBH来分配,其余的内存交由操作系统来分配,也就是HeapCreate来处理。
有128条链表用于管理内存分配,设计思想和SBH内存分配是一样的,只不过能分配的内存更大,对应的cookie只有上cookie,上cookie中存放当前块大小,前一个区块大小,单位为单元(一个单元8byte),而不是字节。
总结
main执行之前
- 设置栈指针:为栈分配相关的位置,用来放一些局部变量和其他数据
- 初始化static静态和global全局变量,即data段的内容:把全局和静态变量初始化,放在相应的位置
- 将未初始化部分的全局变量赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容:将未设置初值的全局变量赋初值
- 全局对象初始化,在main之前调用构造函数
- 将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数:argc为整数,argv为指针的指针
main执行之后
执行全局的析构函数,可以用_onexit 注册一个函数,它会在main 之后执行; 。
侯捷C++八部曲笔记(六、C++程序的生前死后)相关推荐
- 侯捷C++八部曲笔记(四、C++2.0新特性)
侯捷C++八部曲笔记(四.C++2.0新特性) 关键字 noexcept override final decltype =default, =delete nullptr auto explicit ...
- 侯捷C++八部曲笔记(五、内存管理)
侯捷C++八部曲笔记(五.内存管理) 表达式new.delete 基本用法 array new.array delete replacement new ----------------------- ...
- 灵飞经4·西城八部 第十六章 风流云散 6
待他睡熟,乐之扬退出云房,才回头,忽见道清守在门外,见了他眉开眼笑,伸出一手,扯住说道:"道灵师弟,我等你好久了." 乐之扬心跳加快,忙说:"观主好,小道怎敢和您老兄弟相 ...
- 灵飞经4·西城八部 第十六章 风流云散 3
席应真见他一脸茫然,问道:"你想什么?" 乐之扬迟疑 "这件事,她.她怎么一个字也没有提过?" 席应真笑了笑,问道:"跟你说了,你又如何? " ...
- 解题报告:SP1043 GSS4 - Can you answer these queries III(GSS线段树八部曲之三)(区间最大连续子段和)
要注意输入的数据有坑,x可能大于y- 我们可以模块化编程,使得整个代码井井有条 函数可以重名,只要参数不一样就行. 来源 yxc老师的上课板书 然后就是简单的代码了 #include<iostr ...
- 解题报告:SP2713 GSS4 - Can you answer these queries IV(GSS线段树八部曲之四)
x>yx>yx>y是真的艹. 然后就是一道模板题了. #include<bits/stdc++.h>using namespace std; typedef long l ...
- 灵飞经4·西城八部 第十六章 风流云散 2
是日住在农家,乐之扬带飞雪去村外捕猎.白隼小逞威风, 不一会儿就捉到了三只野兔.乐之扬提着猎物凯旋,到了住所外 面,忽见叶灵苏坐在树下,凝神看着什么,有人来了也没知觉.乐之扬望她背影,起了顽皮心思,放 ...
- 灵飞经4·西城八部 第十六章 风流云散 4
乐之扬无奈,掉转马头,一阵风来到蒋山脚下.远远看去, 青瓦玄宫,高出浓萌之上,汉白玉道,直通极峨山门,山门上玉匾鎏金,写着"敕建阳明观"五个御笔大字. 阳明观隶属皇家,不许闲人靠近 ...
- 灵飞经4·西城八部 第十六章 风流云散 5
冷玄离开以后,梁思禽传书给我,告知一切.我那时正在京城,看了信十分担心,于是报与朱元璋.后者却很镇定,笑着说:'这也有趣,寡人很想看一看,这个元朝大汗的太监,有什么了不起的本事.'他说得容易,我却不敢 ...
最新文章
- 在云中利用开源软件进行开发以提高创新能力
- C#自定义工业控件开发
- 【机器学习基础】数学推导+纯Python实现机器学习算法13:Lasso回归
- GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)
- CSS3 Flex 弹性布局用法详解
- GP学习整理(一)—Geoprocessing assembly and Geoprocessor managed assembly
- 使用反射复制一个JavaBean的对象
- mysql ERROR 1396 (HY000): Operation CREATE USER failed 解决办法
- 【渝粤教育】电大中专电商运营实操 (13)作业 题库
- Go语言实战 (William,Kennedy 等著)
- 【成像】【7】太赫兹光学——光学元件和子系统
- js html post提交表单,JS动态创建表单post提交
- 【ionic框架bug】slidebox在使用model或popover后width变为0的解决方案
- 网页换肤--setAttribute - css
- 企查查爬虫python实现(一)整体方法
- 用Jplayer做的一个带动画的播放器
- NYoj21 三个水杯
- excel表格拆分如何快速完成
- Eureka工作原理(Eureka简介Eureka ServerEureka Client自我保护机制分布式系统中的CAP理论Eureka 工作流程)
- Android之检测外网连接性(ping)