内存中有哪些

本文详细解析了程序中的代码段(机器指令)、数据段(初始化变量)、BSS段(未初始化变量)和堆栈(函数调用与线程存储)的内存布局。还比较了堆和栈在申请方式、大小和效率上的区别,强调了内存管理的重要性。
摘要由CSDN通过智能技术生成

** 程序分为:代码段;数据段data;bss段; 堆栈; **

用于存放程序代码的区域, 编译时确定, 只读。更进一步讲是存放处理器的机器指令。

以下的分内是按照进程的内存结构去分类的:
在这里插入图片描述

代码段

就是C程序编译后的机器指令,也就是我们常见的汇编代码。

数据段Data

存放初始化的全局变量和常量、静态变量
这里继续引入数据段的概念,数据段通常用来存放程序已初始化的(非0)全局的变量和静态的变量还有就是常量数据。

BSS段

不在可执行的文件中,由系统初始化。
通常用来存放的是程序中没有初始化或者初始化为0的全局变量和静态变量的一块内存区域。
其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

栈:

1.存放函数参数和内部定义的局部变量(是不包括static修改的局部变量)以及任务切换的上下文信息,函数返回后恢复 ;在函数或过程后,系统会清楚栈上保存的局部变量、函数调用信息等。
2.多线程的基 础是栈,每个线程都有自己专属的栈,中断和异常处理也具有自己专属的栈。
栈的溢出:
函数调用太深(如递归调用),变量申请太大,参数太大。

堆:

堆是先进先出(FIFO)数据结构。堆的地址空间是向上增加,即当堆上保存的数据越多,堆的地址越高。动态内存分配。

需要程序员手动管理内存,是不连续的,存在内存碎片,通过链表将堆空 间连接起来,从逻辑上看就是连续的,每次申请的空间是连续的。

注意:

以上的分类,数据区也称为静态区或者全局区。用来存放的是静态变量和去阿奴变量。内部再细分就是已经初始化的和未初始化的。
常量可以单独提出来的,称为常量区。

堆和栈的区别:

申请方式: 堆需要手动申请和释放,栈则由系统自动分配,因此堆空间使用更加灵活方便;
申请大小: 栈空间是一块连续空间,但是空间比较小,因此容易造成栈溢出,从高地址向低地址扩展;
堆空间是不连续的,空间比较大,从低地址向高地址扩展。
申请效率:栈由系统自动分配,堆分配比较慢,因为空间不连续容易造成内存碎片

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值