深入理解C语言的内存管理.docx
《深入理解C语言的内存管理.docx》由会员分享,可在线阅读,更多相关《深入理解C语言的内存管理.docx(17页珍藏版)》请在第一文库网上搜索。
1、深入理解C语言的内存管理之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。问题不能拖,我这就来学习一下吧,争取一次搞定。在任何程序设计环境及语言中,内存管理都十分重要。内存管理的基本概念分析C语言内存的分布先从1inux下可执行的C程序入手。现在有一个简单的C源程序he11o.c1 #inc1ude2 #inc1ude3 intvar1=1;4 intmain(void)5 intvar2=2;6 rintf(he11ozwor1d!n);7 exit(0);9经过gcche11o.c进行编译之后得到了名为a.ou
2、t的可执行文件tuhooo1oca1host1eet_code$Is-a1a.out-rwxrwr-x.1tuhoootuhooo8592Ju12220:40a.outIs命令是查看文件的元数据信息tuhooo1oca1host1eet_code$fi1ea.outa.out:E1F64-bit1SBexecutab1e,86-64zversion1(SYSV)zdynamica11y1inked(usesshared1ibs),forGNU/1inux2.6.32,Bui1dIDsha1=23c58f2cad39d8b15b91f0cc8129055833372afeznotstripped
3、fi1e命令用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。tuhooo1oca1host1eet_code$sizea.outtextdatabssdechexfi1ename(代码区静态数(全局初始化静态数(未初始化数据(十进制总(十六制总(文件据)据)区)和)和)名)13015608186974da.out显示一个目标文件或者链接库文件中的目标文件的各个段的大小,当没有输入文件名时,默认为a.out。size:支持的目标:e1f32-i386a.out-i386-1inuxefi-app-ia3
4、2e1f32-1itt1ee1f32-bigsrecSymbo1srectekhexbinaryihextrad-coreo那啥,可执行文件在存储(也就是还没有载入到内存中)的时候,分为:代码区、数据区和未初始化数据区3个部分。进一步解读(1)代码区(textsegment)o存放CPU执行的机器指令(machineinstructions)o通常,代码区是可共享的(即另外的执行程序可以调用它),因为对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。(2)全局初始化数据区/静态数据区(i
5、nitia1izeddatasegment/datasegment)o该区包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。例如,一个不在任何函数内的声明(全局数据):1intmaxcount=99;使得变量maxcount根据其初始值被存储到初始化数据区中。1staticmincount=100;这声明了一个静态数据,如果是在任何函数体外声明,则表示其为一个全局静态变量,如果在函数体内(局部),则表示其为一个局部静态变量。另外,如果在函数名前加上static,则表示此函数只能在当前文件中被调用。(3)未初始化数据区。亦称BSS区(un
6、initia1izeddatasegment)存入的是全局未初始化变量。BSS这个叫法是根据一个早期的汇编运算符而来,这个汇编运算符标志着一个块的开始。BSS区的数据在程序开始执行之前被内核初始化为O或者空指针(NU11)。例如一个不在任何函数内的声明:1 1ongsum1000;将变量sum存储到未初始化数据区。下图所示为可执行代码存储时结构和运行时结构的对照图。一个正在运行着的C编译程序占用的内存分为代码区、初始化数据区、未初始化数据区、堆区和栈区5个部分。再来看一张图,多个一个命令行参数区:(1)代码区(textsegment)o代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执
7、行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。代码段:代码段(codesegment/textsegment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。代码区的指令中包括操作码和要操作的对象(或对象地址引用,如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区分配空间,然后引用该数据地址;如果是BSS区和数据区,在代码中同样将引用该数据地址。另外,代码段还规
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入 理解 语言 内存 管理
