c程序的函数在内存的布局

c程序的函数在内存的布局

ID:27550645

大小:348.36 KB

页数:19页

时间:2018-12-03

c程序的函数在内存的布局_第1页
c程序的函数在内存的布局_第2页
c程序的函数在内存的布局_第3页
c程序的函数在内存的布局_第4页
c程序的函数在内存的布局_第5页
资源描述:

《c程序的函数在内存的布局》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、C程序的函数在内存的布局一个C程序一直以来都是由以下5个段(pieces)组成:代码段(textsegment):存放CPU执行的机器指令(machineinstructions)。通常情况卜,代码段是可共享的,使其可共享的目的是对于频繁被执行的程序,只需要在力存屮有一份拷贝即可,比如文本编辑器(texteditors),C编译器,shell等等。另外,代码段也通常是只读的,使其只读的股因是防止一个程序意外地修改了它的指令(preventaprogramfromaccidentallymodifyingitsinstructions)。初始化数掘段/数掘段(initiali

2、zeddatasegment/datasegment):该段包含了在程呼屮明确被初始化的变量。例如,一个不在任何函数内的C声明(Cdeclaration)intmaxcount=99;使得变量maxcount根据其初始值被存储到初始化数据段。未初始化数据段/bss段(uninitializeddatasegment/"bss"segment):bss这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始(stoodfor"blockstartedbysymbol")。在程序开始执行之前,bss段的数据被kernel初始化为0或者空指针(nullpointe

3、rs)。一个不在任何函数内的C声明longsum[1000J;使得变B:sum被存储到未初始化数据段/bss段中。栈段(stack):whereautomaticvariablesarestored,alongwithinformationthatissavedeachtimeafunctioniscalled.每次当一个函数被调用,该函数的返回地址和一些关于caller的信息,比如某些寄存器的内容,将被首先存储到桟段。然后这个被调用的函数(caller)再为它的白动变:和临时变:W:(automaticandtemporaryvariables)在栈段上分配空间。这就足C

4、如何实现函数的递归调用。每次一个递归函数凋用苒本身,一个新的栈框架(stackframe)就会被使用,这样这个新实例栈里的一组变量就不会和该函数的另一个实例栈里面的变量互相干扰。堆段(heap):用于动态内存分配(dynamicmemoryallocation)0一直以來,堆在内存中的位置是介于bss段和栈段之间。图7.6显示了这5个段在内存中的典型排列。这是一张逻辑图,表示了一个程序在内存中看起来是怎么样的。对于一个给定的实现,没有强制的要求说必须按照这种方式来排列这5个段。然而,这给了我们一种典型的便于描述的排列方式。运行在Intelx86处理器上的linux,代码段(

5、textsegment)从地址0x08048000开始(往上),栈底从地址0xC0000000往下(在这个特定的表示结构屮,栈段从高地址向低地址扩展)。在堆顶和栈顶之间的虚拟地址空间是很大的(这保证了2个段不会互相干扰)。往一个a.out中,还有许多段类型存在(Severalmoresegmenttypesexistinana.out)。如符号表(symboltable),调试信息(debugginginformation),动态井享库的连接表(linkagetablesfordynamicsharedlibraries)等。这些额外的section(不是segment)不

6、会作为被一个进程执行的程序映象的一部分。从图7.6巾要注意到bss段的内容没有被存储到磁盘上的程序文件巾(theprogramfileondisk)。这是因为kernel在程序开始运行之前将该段都置为0。程序中唯一需要被存储到程序文件屮的部分是代码段和初始化数据段。命令size会报告这3个段的大小:代码段,初始化数据段,未初始化数据段。例如:$size/usr/bin/cc/bin/shtextdatabssdechexfilename796061536916820581408a/usr/bin/cc6192342112018260658614a0cb6/bin/sh第叫和

7、第五列是这3个段的总计大小,分别以十进制和十六进制表示出来。虚函数在内存中的结构这段日子面试了两次有关C++的工作,面试过程屮都遇到了有关虚拟函数的问题。第一次遇到该问题的时候,我只能说出虚拟函数的用法,但具体在内存中的排布就不知道了。面试完之后,马上到书店找了一木《insidetheC++objectmodel》,由于没有找到侯捷译的中文版,拿了本英文版的回去。英文较菜,也没有定下心来看,结果第一章的内容就理解错了。第二次而视的时候,还是同样的问题,结果回答错了。昨天晚上又重新看了一晚上,感觉对这部分内容有丫正确

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。