- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VC6.0编译器编译期存储器分配模型内存布局
一、内存区域的划分
一个由C/C++编译的程序占用的内存分为以下几个部分:
????1)、栈区(Stack):由编译器(Compiler)自动分配释放,存放函数的参数值,局部变的值等。其操作方式类似于数据结构中的栈。
????2)、堆区(Heap ):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配
????????????方式倒是类似于链表。
????3)、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全
????????????局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
????4)、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
????5)、程序代码区:存放函数体的二进制代码。
?
二、测试案例(源码与反汇编对照)
?
????2.1 ??测试案例源码与反汇编对照
????????????为了能够形象地说明内存布局模型,先来看一段Win32 Console Application代码(表3.1),其中,加粗文字(行最左端为行标号)
????为C源代码,未加粗文字(行最左端为地址)为反汇编后的指令代码。看上去比较零乱,不过一定要耐住性子,后面的文字将基于此。
3.2 ??内存布局图
???????对于该案例,以下几幅图形象地说明了第2节提到的内存5大区域。需要注意的是,图中各区域的起始地址不是绝对的,不同的编译环境可能不完全相同,这里给出的只是一个典型示例。需要注意的是,不同区域地址编址方向也不同。
3、应用
????通过对第3节案例的理解,我们将对一些现象予以解释。
?
3.1、变量初始化
???????1)局部变量将被分配在栈中,如果不初始化,则为不可预料值。编译时,编译器将抛出一个编号为C4700警告错误(local variable 变量名 used without having been initialized)。
???????表4.1代码测试了局部变量未初始化的情况。
??该测试的一个典型的输出结果为:-858993460,同时,编译时编译器抛出了一条警告错误。
??2)全局变量如果不初始化,则默认为0,编译时编译器不提示“变量未初始化”。
???????表4.2代码测试了全局变量未初始化的情况。
?该测试的输出结果为:0.
??3)全局变量初始化为0与不初始化效果一样。请留意表3.1第9行代码,即
intinit_array_g1[10]={0}; ??????????????????????//初始化的全局数组1
?????等效于:
?????int ??init_array_g1[10]; ??????????????????????//初始化的全局数组1
当然,出于谨慎,我们还是建议在使用全局变量前对其初始化。
??3.2 ?变量初始化对代码空间的影响
????????本小节任然讨论变量初始化问题,但出于重视,我们将其独立成小节。现在看两个测试案例。
????????案例1:建立Win32 Console Application工程,工程名:Test1,代码如表4.3。
编译成Debug版本,察看Debug目录下的Test1.exe可执行文件大小,典型大小约184KB(约0.18MB)。
??案例2:建立Win32 Console Application工程,工程名:Test2,代码如表4.4。
??编译成Debug版本,察看Debug目录下的Test2.exe可执行文件大小,典型大小约46MB。
??两个案例唯一区别不过在于是用0还是1初始化 init_array_g1[]数组第0个元素。生成的可执行文件大小却天壤之别。
??上面已经说过,对于全局变量初始化为0与不初始化效果一样。因此,这里的Test1案例并没有对全局变量初始化。
??那么全局变量初始化于不初始化对代码空间又有什么影响呢?
??我们知道,运行于基于冯·诺依曼体系结构系统上的程序,数据和程序是一起存储了。因此,编译时,编译器会将全局变量的初始化数据捆绑到最终生成的程序文件中,而对于未初始化的全局变量只是为其分配(指示)了存储位置,不会将大量的0捆绑到程序中。
??现在再来看以上两个案例。Test1实质上没有初始化全局变量,编译时编译器只是为了init_array_g1[]指出了将要使用的内存位置,而不发生数据绑定。Test2则不同,它将init_array_g1[0]初始化为1,其它元素全部初始化为0,因此,编译器将把init_array_g1[]数组元素的初始化数据全部捆绑到最终的可执行文件中,导致编译后的文件十
您可能关注的文档
最近下载
- 2022年北京市十二中初三(上)期中数学试卷及答案.pdf VIP
- 鲁教版初中九年级化学各章节知识点归纳复习提纲.doc
- 海鲜市场项目可行性研究幻灯片.pptx VIP
- 微电网能量管理:技术、策略与发展路径探究.docx VIP
- 某污水处理工艺设备安装施工方案.docx VIP
- 理智与情感:爱情的心理文化之旅 智慧树网课章节测试答案.docx VIP
- 03.1 20CS03-1 一体化预制泵站选用与安装(一).docx VIP
- 2025年公司组织架构图及各部门职能要求模板参考(架构图可编辑).pdf VIP
- 级配碎石施工技术课件.ppt VIP
- 神话传说故事与中国文化 智慧树 知到答案.docx VIP
文档评论(0)