(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)
文章目录
- bss段
- data段
- text段
- 堆(heap)
- 栈(stack)
- 一个程序本质上都是由 bss段、data段、text段三个组成的。
- 存储类型总结
bss段
bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。
bss是英文Block Started by Symbol(由符号启始的区块)的简称。
bss段属于静态内存分配。
data段
数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。
数据段属于静态内存分配。
text段
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap)
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。
当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);
当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
栈(stack)
栈又称堆栈,是用户存放程序临时创建的局部变量,
也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。
除此以外,在函数被调用时,其参数(函数形参)也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
由于栈的先进后出(FILO)特点,所以栈特别方便用来保存/恢复调用现场。
从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
一个程序本质上都是由 bss段、data段、text段三个组成的。
这样的概念,不知道最初来源于哪里的规定,但在当前的计算机程序设计中是很重要的一个基本概念。
而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。
在采用段式内存管理的架构中(比如intel的80x86系统),bss段通常是指用来存放程序中未初始化的全局变量的一块内存区域,
一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。
比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;
而bss段不在可执行文件中,由系统初始化。
参考文章:(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)
存储类型总结
参考文章:黑马程序员C语言基础(第七天)内存管理
(深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)相关推荐
- bss段,data段、text段、堆heap和栈stack
bss段,data段.text段.堆heap和栈stack bss段 data段 text段 堆(heap) 栈(stack) 例子 在C的学习中,你总避免不了对各类数据的存储区域学习归纳总结,简单的 ...
- BSS段 data段 text段 堆heap 和 栈stack
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. ...
- .data和.text段合并
a.c #include <stdio.h> extern int share; int main(void) { int a=100; swap(&a,&share); ...
- stm32中堆、栈、flash、ROM、RAM、bss段、data段、text段、Code、Ro-data、 ZI-data、RW-data简介
1. 堆.栈.flash.ROM.RAM.bss段.data段.text段.Code.Ro-data ZI-data.RW-data的区别? 1.1 堆.栈简介 堆栈是指在stm32启动文件中定义的那 ...
- 浅谈text段、data段和bss段
一般情况,一个程序本质上都是由 bss段.data段.text段三个段组成--这是计算机程序设计中重要的基本概念.而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用 ...
- linux 目标文件(*.o) bss,data,text,rodata,堆,栈
学习于:http://blog.csdn.net/sunny04/article/details/40627311 linux目标文件 一个简单的程序被编译成目标文件后的结构如下: 注:初始化为0在此 ...
- 2021春深入理解计算机系统大作业---hello的一生
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L021725 班 级 2003006 学 生 杨楠 指 导 ...
- 笔记-深入理解计算机系统
文章目录 计算机系统漫游 信息的表示和处理 信息存储 数字革命的基础--二值信号 信息存储 十六进制表示法的妙用 字数据大小 寻址和字节顺序 表示字符串 布尔代数简介 C语言逻辑运算和移位运算 整数表 ...
- [翻译]理解Unity的自动内存管理
当创建对象.字符串或数组时,存储它所需的内存将从称为堆的中央池中分配.当项目不再使用时,它曾经占用的内存可以被回收并用于别的东西.在过去,通常由程序员通过适当的函数调用明确地分配和释放这些堆内存块.如 ...
最新文章
- oracle sap 用友 保险财务系统比较,SAP和用友的财务管理系统比较详解
- 堆密度测定的意义_堆密度的测量
- java实践源码--哈弗曼树
- 变频器输出功率_工业电气设计|变频器的输出功率该如何选择?
- 【转】idea激活搭建授权服务器
- list 排序_十个必知的排序算法|Python实例系列
- Mac 安装 homebrew 流程 以及 停在 Updating Homebrew等 常见错误解决方法
- SqlServer 更新/新增一条语句,返回其中某一列的值 inserted,@@IDENTITY()
- 在英特尔® 架构平台上开发和优化基于 NDK 的 Android 游戏应用
- 栈的应用--马踏棋盘-贪心加栈
- android 通过串口来控制pwm的输出_ESP8266_07基于PWM的呼吸灯
- mt4怎么用云服务器跟单,【MT4如何登陆观摩账户?MT4观摩账户怎么设置?】
- 200元组群晖—HP惠普T610瘦客户端:直接硬盘启动黑群晖
- 创新或许就是青睐偏执狂
- 寄存器 SRAM DRAM存储单元区别
- 功能强大特别的5款浏览器,简直好用极了
- 【算法笔记】异或运算的奇妙之处
- 千寻位置 开发demo_从智能驾驶到智慧交通,看千寻位置如何助力未来“智”变...
- spidermonkey的使用及代码(SpiderMonkey1.7)
- 名编辑电子杂志大师教程 | 输出HTML,*.EXE,*.ZIP,*.APP电子杂志格式