text段、data段和bss段知识介绍

2023-11-03

一、总体概述

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

2、text(只读)
    text段是程序代码段,在AT91库中是表示程序段的大小,它是由编译器在编译连接时自动计算的,当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段大小,编译连接时,该符号所代表的值会自动代入到源程序中。

3、data(可读可写)
    data包含静态初始化的数据,所以有初值的全局变量和static变量在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和你的程序大小没有关系,但和程序使用到的全局变量,常量数量相关。
1)stack/heap:
栈(stack)
保存函数的局部变量和参数。是一种“后进先出”(Last In First Out,LIFO)的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。对于哪些暂时存贮的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它的信息。栈另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的RAM区的最后。
堆(heap)保存函数内部动态分配内存,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。堆是“先进先出”(First In first Out,FIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。

 

 

一个程序的3个基本段:text段,data段,bss段。

text段在内存中被映射为只读,但.data和.bss是可写的。

text段:就是放程序代码的,编译时确定,只读;

data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量赋初值的静态变量存放在这个区域,常量也存放在这个区域;

bss段:定义而没有赋初值的全局变量和静态变量,放在这个区域;

二、程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data段),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss段)。 - 程序结束后有系统释放。

注:在采用段式内存管理的架构中(比如intel的80x86系统),.bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中。
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

三、例子程序
//main.c

[cpp] view plain copy

  1. int a = 0; 全局初始化区   
  2. char *p1; 全局未初始化区   
  3. main()   
  4. {   
  5. int b; 栈   
  6. char s[] = "abc"; 栈   
  7. char *p2; 栈   
  8. char *p3 = "123456"; 123456/0在常量区,p3在栈上。   
  9. static int c =0; 全局(静态)初始化区   
  10. p1 = (char *)malloc(10);   
  11. p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。   
  12. strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。   
  13. }  
 
  1. int a = 0; 全局初始化区

  2. char *p1; 全局未初始化区

  3. main()

  4. {

  5. int b; 栈

  6. char s[] = "abc"; 栈

  7. char *p2; 栈

  8. char *p3 = "123456"; 123456/0在常量区,p3在栈上。

  9. static int c =0; 全局(静态)初始化区

  10. p1 = (char *)malloc(10);

  11. p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。

  12. strcpy(p1, "123456"); 123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

  13. }

 

、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活
2.5堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:

[cpp] view plain copy

  1. #include <stdio.h>    
  2. void main()   
  3. {    
  4. char a = 1;  char c[] = "1234567890";    
  5. char *p ="1234567890";    
  6. a = c[1];    
  7. a = p[1];    
  8. return;    
  9. }  

对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。

小结
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

text段、data段和bss段知识介绍 的相关文章

  • Visual Studio Code 配置java开发环境

    最近在学习算法 有时需要在自己的机器上调试一下代码 有些算法题目的题解是用java编的 因为这类代码只是单个的java文件 所以不想动用MyEclipse那样的重型工具 正好机器上有一个轻量级的VS Code 我就试着在上面搭了一个java
  • windows上的linux子系统(WSL)

    目录 一 介绍 二 原理 2 1 wsl组件 2 2 wsl运行过程 2 3 文件系统 2 4 禁忌 三 使用 3 1 安装 3 2 用户账户和权限 3 3 wsl管理 3 3 互操作 参考 推荐阅读 一 介绍 Windows Subsys
  • 时间对象new Date 以及中国标准时间与时间戳,标准时间之间的转换

  • C语言程序设计大作业——员工管理系统(代码超详细内含实验报告)

    写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也希望大家多多支持我鸭
  • 基于BP神经网络的回归预测

    基本概念 误差反向传播神经网络简称为BP Back Propagation 网络 它是一种具有三层或三层以上的多层神经网络 每一层都由若干个神经元组成 如图所示为一个BP神经网络的结构图 它的左 右各层之间各个神经元实现全连接 即左层的每一
  • LINUX下搭建JAVA的开发环境

    1 Linux下JDK的安装 至于下载JDK的二进制可执行文件 这里就不讲了 大家直接到官方网去下载就可以了 1 我下载下来的JDK安装文件名称为 jdk 1 5 0 14 linux i586 rpm bin 我把它保存在 tools目录
  • el search 条件更新

    from elasticsearch import Elasticsearch es Elasticsearch 192 168 55 90 9200 updateBody query bool must wildcard fileName
  • esxi管理端口_VMWare Esxi 基于NAT的管理端口转发

    上一篇关于WMWare Esxi的文章介绍了在多台虚拟机之间用软路由共享一个IP的情况 VMWare Esxi 海蜘蛛配置NAT共享IP上网 其中用了两个IP 一个用于虚拟机上网 一个用于Management Network 但是在只有一个
  • R语言 数据导出和导入 csv tsv xls xlsx

    R语言 Excel 导出为Excel的xls xlsx 导出数据 write table data2 file train1 xls sep t row names TRUE col names TRUE quote TRUE write
  • Promise的理解和使用

    一 Promise 是什么 1 理解 Promise是一门新的技术 ES6规范 Promise是JS中进行异步编程的新解决方案 旧方案是使用回调函数 Promise是一个构造函数 Promise对象用来封装一个异步操作并可以获取其成功 失败
  • 使用 Docker 部署 Prometheus + Grafana 监控平台

    使用 Docker 部署 Prometheus Grafana 监控平台 默认docker 已经安装好 我使用的是CentOS7 注意一定要开启服务器对应的端口 1 安装Prometheus docker run itd name prom
  • Windows虚拟机激活

    打开cmd命令提示符 首先连接kms服务器 slmgr skms skms netnr eu org 接着输入对应系统版本的产品密钥 xxxxx xxxxx xxxxx xxxxx xxxxx slmgr ipk xxxxx xxxxx x
  • 【DEBUG】MoviePy couldn't find the codec associated with the filename.Provide the 'codec' parameter

    问题描述 ValueError MoviePy couldn t find the codec associated with the filename Provide the codec parameter in write videof
  • __weak详解

    object默认的修饰符是 strong 然而在开发中我们也经常使用 weak 用它来解决循环引用的问题 两个对象相互引用无法释放 造成内存泄露 用 weak来破坏一个强引用 来达到正常释放的目的 这种情况常见于block中 但是有没有想过
  • linux驱动面试题2018

    linux驱动面试题2018 面试题整理 含答案 版权声明 本文为博主原创文章 未经博主允许不得转载 转载请标明原址 https blog csdn net kai zone article details 82021233 前言 这篇文章
  • Camera:高斯模糊

    高斯模糊场景 手机相机不同于工业相机以及车载相机 手机相机的模式切换往往会伴随着预览分辨率的改变 而分辨率的切换伴随手机App gt Framework gt HAL gt Drivel一层层的下发上传 所造成的时间延迟已经带来了不可忽略的
  • Elasticsearch数据刷新策略RefreshPolicy简述

    说明 默认情况下ElasticSearch索引的refresh interval为1秒 这意味着数据写1秒才就可以被搜索到 每次索引refresh会产生一个新的 lucene 段 这会导致频繁的 segment merge 行为 对系统 C
  • node入门(一)bcrypt密码加密和验证

    前言 node js越来越被广泛的使用 现在找工作职位要求上大都写熟悉或了解一门后端 语言 如 java php node等 Node js是一个javascript运行环境 它让javascript可以开发后端程序 实现几乎其他后端语言实
  • 一道智力题--三个运动员参加M个项目,在每一项目中,第一,第二,第三名分别得X,Y,Z分

    题目 有一种体育竞赛共含M个项目 有运动员A B C三人参加 在每一项目中 第一 第二 第三名分别得X Y Z分 其中X Y Z为正整数且X gt Y gt Z 最后A得22分 B与C均得9分 B在百米赛中取得第一 1 求M的值 2 在跳高
  • 使用excel将一个数字随机分摊?

    在Excel中 如何把一个数值随机分配到N个单元格内 分配后每个单元格的数值之和等于这个数值 比如这里我们需要在A1 A10区域中随机输入数字 其实结果等于10000 这里我们可以选中区域 然后输入公式 FREQUENCY ROW 1 10

随机推荐

  • python代码,用于获取mp3部分信息并存入MySQL中

    a1 a2 a3 a4参数需要自己输 host a1 user a2 password a3 database a4 import os import base64 import struct import pymysql 这是python
  • 在github上创建个人主页的方法【2023更新版】

    01 进入github的网站 链接 https github com 然后注册 登陆 注意登陆时设置的用户名 username 就是将来你个人主页的三级域名 所以这里一定要慎重填写username 如下图所示 02 注册完成后进入个人主页如
  • (详细简单成功版本)Mysql主从复制

    博主不易 如果有帮助点个赞加个关注再走啊家人们 目录 介绍 配置 前置条件 大坑 如果两份mysql文件都是复制的一份 那么就修改其中一份的uuid 要不后续配置不成功 配置 主库Master 1 修改Mysql数据库的配置文件my ini
  • 为自己的站点实现访客统计

    简介 我们都很好奇自己的站点有没有被人所熟知 每天能有多少的访问量 最简单的方法便是使用平台的统计功能 比如cnzz 百度统计 谷歌统计等等平台 但这篇文章的重点是自己写代码实现统计功能 一 HTML语句实现 推荐加到页面的底部界面
  • 数组 求上升区间的高度和

    求上升区间的高度和 LC 买卖股票的最佳时机 II 思路 如果上升 则max next pre Objective C 求上升区间的高度和 NSMutableArray array NSMutableArray arrayWithArray
  • Java项目:考试系统(java+JSP+bootstrap+Servlet+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 本系统分为两个角色 一个是考生 一个是管理员 考生功能如下 登录 选择考试科目 选择考卷 在线考试 提交试卷 并且查询自己的考试成绩 管理员功能如下 登录 添加试卷 并且添加试卷里的题目 编辑
  • Linux(Ubuntu)系统上下载安装Redis

    redis最新版本可以到官网自己下载 这里提供5 0 2的版本 Redis 5 0 2 tar gz网盘资源如下 百度网盘 请输入提取码https pan baidu com s 1ZGy vI7n4RmTb9kLnWe91w压缩包下载完成
  • 使用路由器搭建局域网

    A 如果搭建的是有网局域网 网线插到WAN接口 一般都是蓝色的 买路由器时会自带一条网线 把它的一头插到LAN接口 随便插一个口就行 另一头插到电脑网线接口上就好 B 如果搭建的是无网局域网 路由器只需要接通电源就行 WAN接口不需要插网线
  • 机器学习——SVM的易错题型

    问 支持向量机仅可以用于处理二分类任务 答 错误 支持向量机可以用于处理多分类任务 通过使用一对多或一对一的方法 将多个类别分别与其他类别做二分类 也可以使用多类支持向量机算法 直接将多个类别一起纳入训练和分类过程中 此外 支持向量机还可以
  • YoloV8改进策略:重新思考高效的基于注意力的移动块模型EMO重新定义了轻量化的YoloV8

    文章目录 摘要 论文翻译 EMO 重新思考高效的基于注意力的移动块模型 1 介绍 2 方法论 归纳法和演绎法 2 1 通用效率模型标准 2 2 元移动块 2 3 微设计 倒置残余移动块 2 4 面向密集预测的EMO宏观设计 3 实验 3 1
  • Large Language Models and Knowledge Graphs: Opportunities and Challenges

    本文是LLM系列的文章 针对 Large Language Models and Knowledge Graphs Opportunities and Challenges 的翻译 大语言模型和知识图谱 机会与挑战 摘要 1 引言 2 社区
  • 40道Python经典面试题(附答案)

    1 什么是Python 使用Python有什么好处 Python是一种编程语言 包含对象 模块 线程 异常和自动内存管理 Python的好处在于它简单易用 可移植 可扩展 内置数据结构 并且它是一个开源的 2 什么是PEP 8 PEP 8是
  • uniapp踩坑-使用vue-cli框架对node版本有要求

    uniapp踩坑 使用vue cli框架对node版本有要求 前言 背景 最近在开发uniapp 官方文档提供的开发方式有两种 一种是通过HBulider可视化界面创建 一种是通过vue cli命令行创建 因为可视化更加方便 所以就使用了可
  • 设计算法来统计一个输入字符串中所包含的整数个数,并输出这些数

    设计算法来统计一个输入字符串中所包含的整数个数 并输出这些数 假设输入的字符既有数字又有非数字的字符 例如 ak123x456 17960 302gef4563 其中连续数字作为一个整体看成整数 例如123 456等 include
  • 二进制补码运算

    在计算机系统中 数值一律用补码来表示和存储 原因在于 使用补码 可以将符号位和数值域统一处理 同时 加法和减法也可以统一处理 此外 补码与原码相互转换 其运算过程是相同的 不需要额外的硬件电路 补码运算 正数补码是其原码 负数的补码为其数值
  • react使用dnd实现简单的拖拽排序

    在react项目中使用dnd实现一个简单的拖拽排序功能 首先简单的介绍一下dnd React DnD是一组React实用程序 可帮助您构建复杂的拖放界面 同时保持组件之间的耦合 1 DndProvider组件为您的应用程序提供React D
  • Vue 3 快速上手

    Vue 3 快速上手 官网 配置环境变量和nodejs node vue 开发环境搭建 第二天的时候 vue create xxx xxx xxx 项目名 失败 前端项目问题解决 第二天修改环境配置之后 纠正之后 概念 思想 创建项目 cm
  • 国产适配之MySQL替换为达梦8数据库

    1 背景 项目中要做国产化 MySQL要替换成达梦8数据库 项目中MySQL的建表语句和内置数据通过 sql文件维护 安装时会初始化表结构和表内置数据 项目架构为SpringBoot JPA Mybatis 适配工作内容包括数据库迁移 数据
  • Vue实现点击更改页面字体大小

    html 1 点击大中小 页面字体会切换到对应的css样式 2 big mid sml 代表预设定了三种字体大小 3 on 代表当前选中了哪一个的样式 big min sml 选中后字体加粗 4 v html 利用后端传来的页面数据 通过v
  • text段、data段和bss段知识介绍

    一 总体概述 1 bss 可读可写 bss是英文Block Started by Symbol的简称 通常是指用来存放程序中未初始化的全局变量的一块内存区域 在程序载入时由内核清0 BSS段属于静态内存分配 它的初始值也是由用户自己定义的连