进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途 不一而不尽相同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到5种不同的数据段。
Linux进程的五个段:

下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的。

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

它是由操作系统分配的,内存的申请与回收都由OS管理。

PS

全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上分配空间。.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。

bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。 数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

总结

1、栈空间

1)动态局部变量
2)形参
3)函数返回地址

2、堆空间

1)malloc/new所申请的内存空间

3、数据段(静态存储区)

1)静态变量
2)全局变量
3)字符串常量

4、代码段

程序代码主体、函数主体、为二进制形式
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等

内存中的存储空间(栈空间、堆空间、数据段、代码段)相关推荐

  1. 内存空间分几部分:代码段、数据段,栈,堆 (收集整理)

    1.函数代码存放在代码段.声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间. 全局变量或静态变量,放在数据段, 局部变量放在栈中, 用new产生的对象放在堆中, 内存分为4段,栈区 ...

  2. C语言面试题--已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少?

    已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少? 用共用体方法:共用体内的空间是公用的,每一个成员都可以访问共用 ...

  3. 内存、数据结构之栈和堆的区别?

    网上有一篇很好的文章,我差不多直接搬运过来了. 来源:http://www.cleey.com/blog/single/id/776.html 原文如下: 可能很多同学在这个概念上有些模糊,其实堆栈分 ...

  4. 16位汇编 数据段 栈段 代码段

    使用数据段,栈段,代码段 实现置换功能 0123  0456  0789  0abc  0def  0fed    0cba  0987 0987  0cba  0fed   0def   0abc ...

  5. java:栈空间,堆空间,方法区

    栈空间: 1. 栈是方法执行的内存模型,用栈存储方法执行的信息是再合适不过了.每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法出口等). 2. JVM为每一个线程创建一个栈,用于存放该线程执 ...

  6. java 栈空间_初学JAVA——栈空间堆空间的理解

    1.Person pangzi;    //这是在"开拓空间"于栈空间 pangzi=new Person();    //这是赋值于堆空间 上两步就是在做与空间对应的事. 2.值 ...

  7. .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一(转)

    http://www.codingthink.com/c/20121223/201212231458171.html 原文出处: http://www.c-sharpcorner.com/Upload ...

  8. 函数在实现过程内存中的压栈和出栈

        关于函数在调用过程中的压栈和出栈问题在学习的时候就感觉很经典,对程序的把握可以提升一个台阶.     一.首先让我们写出一个简单的函数.(我是在vc6.0中实现,并不表示vs编译器底下不可以实 ...

  9. 小数在内存中究竟是如何存储的(C语言代码详细讲解 2)

    小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计 二进制形式的浮点数的存储   虽然C语言标准没有规定 base 使用哪种进制,但是在实际应用中,各种编译器都将 base 实现为二进制,这样不仅贴近计 ...

  10. rmd中无法打开链结r_R语言数据实战 | 代码规范与文档撰写

    点击上方"蓝字"带你去看小星星 R语言虽然有着强大的统计分析和绘图功能,但说到底它是一门编程语言.既然如此,那么R语言就有自己的代码规范,这些规范旨在让R学习者养成良好的代码写作习 ...

最新文章

  1. 浅入浅出 Android 安全:第三章 Android 本地用户空间层安全
  2. struts tags 学习
  3. 在Java中哪里可以获得“UTF-8”字符串文字?
  4. 美国的机器人军团要来了吗?
  5. ajax跨域访问控制
  6. Java-命令行传递参数
  7. PCB画板子常用快捷键总结
  8. 产品 电信nb接口调用_通用电信华为物联网IOT开放平台NB-IOT对接profile透传编解码插件离线定制开发...
  9. 和菜鸟一起深入学习国嵌实验之vim常用命令
  10. c语言中用double写圆的面积,用java写一个函数area,接收一个double类型的参数(表示圆的半径r),用于计算圆的面积...
  11. 湖北工业大学机械c语言考试试题,关于部分同学重新参加《C语言程序设计》、《计算机及网络应用基础》课程补考的通知...
  12. 请问对一个排好序的数组进行查找,时间复杂度为()
  13. 全网最全最新的免版权图库
  14. 可恢复保险丝的内部结构
  15. 当兵的目标和计划_最新大学生征兵工作计划
  16. [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量安装eclipse
  17. 游戏一、脑洞大开3(密文破译)
  18. ResNet、ResNeXt详解以及代码实现
  19. 手工卡纸做机器人_折纸大全手把手教你安卓机器人的手工制作教程
  20. word中怎么每页设置50行 wps中怎么每页设置50行

热门文章

  1. Python学习:使用pycharm运行py文件报错系统找不到指定的路径
  2. 微信公众号 接口配置
  3. 蓝桥杯2018国赛B组第四题 调手表
  4. 张亮:十万级并发任务调度框架 ElasticJob 的定位与设计理念
  5. 2019数学建模比赛总结
  6. 在php中如何设置字体宋体,css怎么设置字体为宋体?
  7. 深入理解Java虚拟机-Java内存区域与内存溢出异常
  8. 第三阶段应用层——1.11 数码相册—setting_page设置页面的显存管理、页面规划、输入控制
  9. python保存模型方法_TensorFlow模型保存和提取的方法
  10. AtCoder Beginner Contest 233(A~D)题解