VC6.0编译器编译期存储器分配模型内存布局.docVIP

VC6.0编译器编译期存储器分配模型内存布局.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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[]数组元素的初始化数据全部捆绑到最终的可执行文件中,导致编译后的文件十

文档评论(0)

love3892 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档