原文地址:http://ju-kevin.spaces.live.com/blog/cns!907BD90CD611C0C7!217.entry(已不能访问)

转载地址:http://blog.sina.com.cn/s/blog_697c18bb0100lnod.html

C++程序的存储空间布局

C++程序的存储空间布局 作者:JuKevin

C++程序是由一下几部分组成:

(1) 正文段 (.text)

程序代码就存储咋text 段,这是由C P U执行的机器指令部分。通常,正文段是可共享的,所以即使是经常执行的程序(如文本编辑程序、C编译程序、s h e l l等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。

当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段大小,编译连接时,该符号所代表的值会自动代入到源程序中。

(2) 只读数据段 .rdata

只读数据是在程序运行期间不能被修改的,程序只能读取这些数据,因此编译器把他们组织在一起存储在只读数据段。

(3) 初始化数据段data

data端用于存储经过初始化的数据,包括带初值的全局变量和static变量,都存储在data区。data段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,和程序大小没有关系,但和程序使用到的全局变量,常量数量相关。

(3) 未初始化数据段bss

bss这一名称来源于早期汇编程序的一个操作符意思是Block Started by Symbol(由符号开始的块),通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。 BSS段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的RAM区内,源程序中使用malloc分配的内存并不是这一块,它不是根据data大小确定,主要由程序中同时分配内存最大值所确定,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。

(4) 栈stack

stack是用来存储局部变量以及每次函数调用时所需保存的信息。每次函数调用时,其返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。然后,新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈, C函数可以递归调用。stack是一种“后进先出”(Last In First Out,LIFO)的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。对于哪些暂时存贮的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它的信息。栈另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的RAM区的最后。

(5) 堆heap

编译器通常在堆中进行动态内存分配

由于历史上形成的惯例,堆位于非初始化数据段顶和栈底之间。堆是“先进先出”(First In first Out,FIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。

数据存储

(1) 常量

对于整型常量和字符型常量,由于不需要写操作,编译器会将其直接编译在代码之中,因此不需要存储。

对于字符串常量,编译器将其放入只读数据端.rdata,同事对于相同的字符串常量,编译器会优化并只存储一次。

(2) 变量

- 全局变量

未初始化的,存储于.bss ; 初始化的,存储于.data

- 静态变量

和全局变量相同

-自动变量

局部变量存储于stack ; 动态分配的内存,存储于heap。

- 寄存器变量

存储位置在CPU寄存器内。

C++程序的存储空间布局相关推荐

  1. 7.6 C程序的存储空间布局

    7.6 C程序的存储空间布局 由于历史原因,C程序一直由下列几部分组成: • 正文段.这是由CPU执行的机器指令部分.通常,正文段是可共享的,所以即使是经常执行的程序(如文本编辑程序.C编译程序.sh ...

  2. Linux size命令和C程序的存储空间布局

    size - list section sizes and total size是GNU Development Tools,列出目标文件各个部分所占的字节数,当不输入目标文件时,将会把a.out文件 ...

  3. C 程序的存储空间布局

    1. 存储空间布局 static int g_init = 1; // data 段 static int g_uninit; // bss 段int main() { static int s_in ...

  4. C程序的存储空间布局

    系统空间: 为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数. 内核总是驻留在内存中,是操作系统的一部分. 系统中所有进程对应的虚拟地址空间的内核区都会映射到同一块物理内存上(系 ...

  5. C语言存储空间布局以及static解析

    本文我将采用Linux环境测试C语言存储空间布局,以及采用VC6.0来测试static的常见用法.采用linux环境来测试c语言存储空间布局,是因为Linux很容易利用shell命令中的size命令查 ...

  6. C语言存储空间布局以及static详解

    本文我将采用Linux环境测试C语言存储空间布局,以及采用VC6.0来测试static的常见用法.采用Linux环境来测试C语言存储空间布局,是因为Linux很容易利用shell命令中的size命令查 ...

  7. C语言实现数据文件怎么找,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

  8. c语言程序怎么颠倒数据,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

  9. 如何保存文件为c语言格式,急求如何将下列C语言程序数据存储到文件中?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中. #include int ...

最新文章

  1. 百度投资创维10亿,联手构建智能家居AI生态
  2. 铁路交通系统安全堪忧:丹麦国家铁路运营商DSB和RENA售票网站接连受创
  3. 但凡网络工程师会这个技能,也不至于天天抱怨工资低
  4. 覆盖 19 个城市,19,000 个样本,零售业深度研究报告发布
  5. php ip2long bug,PHP代码ip2long 循环有关问题
  6. 删除指定路径下指定天数之前的文件
  7. 一个程序段两个小问题
  8. sql update date类型_数据工厂可视化操作与SQL查询——1.基础篇
  9. DedeCms进行SEO优化全攻略
  10. 根据二次曲面模型法建立区域高程异常拟合模型
  11. python爬虫qq付费音乐_Python 应用爬虫下载QQ音乐
  12. 常见中文字体-英文名
  13. 线性代数 --- 什么是矩阵的逆?(个人笔记扫描版)
  14. 电子书 UNIX环境高级编程(第3版).pdf
  15. FDTD的PML设置
  16. 中国鸡荣华鸡为什么干不过洋鸡肯德基
  17. java周志第二周_20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算
  18. 求幂级数展开的部分和 / 求分数序列前N项和 / 特殊a串数列求和
  19. img-polaroid_这个由AI驱动的宝丽来会散发出幼稚的图画而不是照片
  20. html 计算器 ansi转换,HTML ANSI

热门文章

  1. 注销公司都需要注销哪些方面?
  2. 人间富贵花间露,纸上功名水上沤
  3. 写论文一定要会-------中英文参考文献的导出方法
  4. 基于Python实现的作家风格识别
  5. 小品《生活不止眼前的苟且》剧本
  6. 焦虑症是精神病吗?缓解焦虑症的方法有哪些
  7. 【单片机】温度感应报警装置的设计与制作(说明书)
  8. 中国千家主要规划设计勘察单位
  9. 自建kafka和公有云kafka对比
  10. python 山脊图_Python提取DEM数据的山脊线代码