BSS段、数据段、代码段、堆与栈

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

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

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

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

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

【例一】

用cl编译两个小程序如下:

程序1:

int ar[30000];
void main()
{
    ......
}


程序2:

int ar[300000] =  {1, 2, 3, 4, 5, 6 };
void main()
{
    ......
}


发现程序2编译之后所得的.exe文件比程序1的要大得多。当下甚为不解,于是手工编译了一下,并使用了/FAs编译选项来查看了一下其各自的.asm,发现在程序1.asm中ar的定义如下:

_BSS SEGMENT
     ?ar@@3PAHA DD 0493e0H DUP (?)    ; ar
_BSS ENDS


而在程序2.asm中,ar被定义为:

_DATA SEGMENT
     ?ar@@3PAHA DD 01H     ; ar
                DD 02H
                DD 03H
                ORG $+1199988
_DATA ENDS


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

【例二】

编译如下程序(test.cpp:
#include <stdio.h>

#define LEN 1002000

int inbss[LEN];
float fA;
int indata[LEN]={1,2,3,4,5,6,7,8,9};
double dbB = 100.0;

const int cst = 100;

int main(void)
{
    int run[100] = {1,2,3,4,5,6,7,8,9};
    for(int i=0; i<LEN; ++i)
        printf("%d ", inbss[i]);
    return 0;
}

命令:cl /FA  test.cpp 回车 (/FA:产生汇编代码)
产生的汇编代码(test.asm):
    TITLE    test.cpp
    .386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT    SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT    ENDS
_DATA    SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA    ENDS
CONST    SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST    ENDS
_BSS    SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS    ENDS
_TLS    SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS    ENDS
FLAT    GROUP _DATA, CONST, _BSS
    ASSUME    CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC    ?inbss@@3PAHA                    ; inbss
PUBLIC    ?fA@@3MA                    ; fA
PUBLIC    ?indata@@3PAHA                    ; indata
PUBLIC    ?dbB@@3NA                    ; dbB
_BSS    SEGMENT
?inbss@@3PAHA DD 0f4a10H DUP (?)            ; inbss
?fA@@3MA DD    01H DUP (?)                ; fA
_BSS    ENDS
_DATA    SEGMENT
?indata@@3PAHA DD 01H                    ; indata
    DD    02H
    DD    03H
    DD    04H
    DD    05H
    DD    06H
    DD    07H
    DD    08H
    DD    09H
    ORG $+4007964
?dbB@@3NA DQ    04059000000000000r        ; 100    ; dbB
_DATA    ENDS
PUBLIC    _main
EXTRN    _printf:NEAR
_DATA    SEGMENT
$SG537    DB    '%d ', 00H
_DATA    ENDS
_TEXT    SEGMENT
_run$ = -400
_i$ = -404
_main    PROC NEAR
; File test.cpp
; Line 13
    push    ebp
    mov    ebp, esp
    sub    esp, 404                ; 00000194H
    push    edi
; Line 14
    mov    DWORD PTR _run$[ebp], 1
    mov    DWORD PTR _run$[ebp+4], 2
    mov    DWORD PTR _run$[ebp+8], 3
    mov    DWORD PTR _run$[ebp+12], 4
    mov    DWORD PTR _run$[ebp+16], 5
    mov    DWORD PTR _run$[ebp+20], 6
    mov    DWORD PTR _run$[ebp+24], 7
    mov    DWORD PTR _run$[ebp+28], 8
    mov    DWORD PTR _run$[ebp+32], 9
    mov    ecx, 91                    ; 0000005bH
    xor    eax, eax
    lea    edi, DWORD PTR _run$[ebp+36]
    rep stosd
; Line 15
    mov    DWORD PTR _i$[ebp], 0
    jmp    SHORT $L534
$L535:
    mov    eax, DWORD PTR _i$[ebp]
    add    eax, 1
    mov    DWORD PTR _i$[ebp], eax
$L534:
    cmp    DWORD PTR _i$[ebp], 1002000        ; 000f4a10H
    jge    SHORT $L536
; Line 16
    mov    ecx, DWORD PTR _i$[ebp]
    mov    edx, DWORD PTR ?inbss@@3PAHA[ecx*4]
    push    edx
    push    OFFSET FLAT:$SG537
    call    _printf
    add    esp, 8
    jmp    SHORT $L535
$L536:
; Line 17
    xor    eax, eax
; Line 18
    pop    edi
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS
END
 ----------------------------------------
通过汇编文件可以看到,数组inbssindata位于不同的段(inbss位于bss段,而indata位于data段)
若把test.cpp中的indata数组拿掉,查看生成的exe文件的大小,可以发现,indata拿掉之后exe文件的大小小了很多。而若拿掉的是inbss数组,exe文件大小跟没拿掉时相差无几。

说明了:
bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。

数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python安装模块方法_Python安装模块的几种方法

一、方法1&#xff1a; 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2&#xff1a; 多文件模块&#xff0c;带setup.py 下载模块包&#xff0c;进行解压&#xff0c;进入模块文件夹&#xff0c;执行&#xff1a; python setup.py install 三、 方法3&#xff1a;easy…

使用参数来防止SQL注入

SQL注入的威力是不可忽视的&#xff0c;下面我们主要介绍防范方法——使用参数化SQL。对于不同的数据供应器都有对就的 Parameter 来表示SQL语句或者存储过程中的各种参数。参数和数据库字段的真实类型——对应&#xff0c;所有参数的值会仅仅被认为一个参数。因此&#xff0c;…

高通qca9565网卡驱动_修改注册表让Surface Go的无线网卡支持频段选择

我的Surface Go是第一代无LTE版本&#xff0c;无线网卡型号是Qualcomm Atheros QCA61x4A&#xff0c;因为一些原因急需优先选择5GHz频段wifi的功能&#xff0c;因此写下本文。本文的解决方案仅能保证对Qualcomm Atheros QCA61x4A这一型号的网卡有效&#xff0c;对于其他同品牌不…

异或运算^和他的一个常用作用

发现一个新知识&#xff0c;介绍给大家&#xff1a; 二进制异或运算&#xff1a;两者相等为0,不等为1. 这样我们发现交换两个整数的值时可以不用第三个参数。 如a11,b9.以下是二进制 aa^b1011^10010010; bb^a1001^00101011; aa^b0010^10111001; 这样一来a9,b11了。 举一个运…

微服务 前台调用后台的慢的原因_20年IT农民工分享SpringCloud微服务架构实战文档...

前言越来越多的企业使用 SpringCloud 实现微服务架构设计。我们可以看到这样一种现象&#xff1a;不管是全新开发&#xff0c;还是系统重构&#xff0c;大家似乎都在争先恐后地使用微服务。对于一个Java开发人员来说&#xff0c;学习微服务相关知识大有裨益。本文将从架构设计、…

流量专家为114搜索提供权威流量访问统计

一&#xff1a;系统介绍互联网流量实时统计产品是一套网站流量统计分析系统。致力于为所有网站、第三方统计等用户提供网站流量监控、统计、分析等专业服务。 通过互联网流量实时统计产品 &#xff0c;站长可以随时知道自己网站的被访问情况&#xff0c;每天多少人看了哪些网页…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件介绍)

Anaconda软件介绍 Anaconda下载与安装&#xff08;安装之后会有详细步骤&#xff09; 下载地址&#xff1a; Anaconda官网 https://www.anaconda.com/distribution/ 清华大学软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 软件界面及界面功能介绍 界…

wince 自带的web server

同arm linux相比,wince的网络功能用的相对较少.实际上,wince的网络功能并不逊色,比如"remote display control"就能通过网络远程控制终端. wince自带的web server也是功能强大,绝非arm linux上轻量级的boa之类可比(当然arm linux上有很多其他选择).PB工程加上web se…

Wince6.0p上用ASP技术实现Webserver

一 环境的搭建 1. 内核定制时选上vbscript、javascript&#xff0c;wince6.0自到的web服务器就可以解析vbscript、javascript脚本语言。 2. 数据库的安装 项目中使用的是SQLce3.5数据库&#xff0c;它的安装文件随vs2008一起发布&#xff0c;安装文件有三个&#xff1a;sqlce.w…

opengles 3.0游戏开发_开发者们,快来测试Android Q啦!

近日&#xff0c;谷歌正式推出Android Q Beta 1版本及预览版SDK&#xff0c;TestBird已部署到测试机型&#xff0c;开发者们可到TestBird测试平台测试。此次Android Q 做了不少改进&#xff0c;不少尝鲜的用户反映Android Q对全面屏的手势操作更加友好&#xff0c;整体使用体验…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件使用)

Python的运行模式 交互模式 打开命令行窗口 键入 python&#xff0c;激活python交互模式&#xff0c;出现Python提示符 >>> 在提示符 >>> 处, 写入Python语句 回车&#xff0c;得到Python语句的执行结果 退出Python交互模式 在Python命令提示符后&#…

Ubuntu10.04No init found. Try passing init= bootarg解决方案

在正常状态下误敲 fsck 命令后&#xff0c;果断悲剧。屏幕错误提示错误显示类似于&#xff1a;mount: mounting /dev/disk/by-uuid/***************************** on /rootfailed: Invalid argumentmount: mounting /sys on /root/sys failed: No such file or directorymount…

greenfoot推箱子游戏_推箱子小游戏V2.0更新

小游戏实践推箱子V2.0大家好&#xff0c;我是努力学习争取成为优秀的Game Producer的路人猿&#xff0c;我们上期一起学习制作推箱子的简易V1.0版本&#xff0c;学习了如何响应用户的输入以及面对箱子的各种情况&#xff0c;今天我们把这个程序完善&#xff0c;制作V2.0~ 接着上…

ASP+COM技术在嵌入式Webserver中的应用

1 .COM组件介绍 COM(Component Object Model)&#xff0c;即组件对象模型&#xff0c;它是微软公司开发的一种新的软 件开发技术&#xff0c;Microsoft 的许多技术&#xff0c;如 ActiveX、DirectX、以及 OLE 等都是基于 COM 而建立起来的。COM 标准包括规范和实现两大部分&…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(包管理和环境管理)

包管理和环境管理(以下操作也可在anaconda界面&#xff0c;进行可视化操作) 包管理&#xff1a;包的安装、卸载、更新和查找等等 conda命令 conda install <包名称列表> 同时安装多个包 conda install numpy scipy 指定安装的版本(&#xff0c;均可) conda instal…

双向(端)链表、栈、队列

双端链表 双端栈 双端队列 从实用角度,感受不出双端队列的好处,但其可以充当栈和队列的角色. 参考资料:http://baike.baidu.com/view/1627726.htm Test static void Main() {var deque new Deque<int>();Console.WriteLine("Stack:");//stackdeque.AddFirst(1…

wince6.0开机自启动应用程序

1、在VS2005下建立一个Win32智能设备项目&#xff0c;取名为ShellExe&#xff0c;编译如下代码&#xff1a; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { WIN32_FIND_DATA fd; HANDLE hdINVALID_HANDLE_VAL…

python语言单行注释符_云计算开发学习笔记:Python3注释

大家在学习各种编程语言的时候都会在代码里面添加一些注释&#xff0c;这个也是为了方便日后对代码的查找和修改&#xff0c;各种编程语言的注释方式略有不同&#xff0c;Python3语言也一样有自己的注释方式&#xff0c;下面我们来了解一下都有哪几种。 确保对模块&#xff0c;…

神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(安装TensorFlow2.0)

创建环境并激活 conda create --name tensorflow2.0 python3.7 activate tensorflow2.0 安装相关软件包&#xff08;conda命令或pip命令2选1&#xff09; conda install numpy matplotlib PIL scikit-learn pandas pip install numpy matplotlib Pillow scikit-learn pand…

python决策树sklearn_python利用sklearn包编写决策树源代码

本文实例为大家分享了python编写决策树源代码&#xff0c;供大家参考&#xff0c;具体内容如下 因为最近实习的需要&#xff0c;所以用python里的sklearn包重新写了一次决策树。 工具&#xff1a;sklearn&#xff0c;将dot文件转化为pdf格式&#xff08;是为了将形成的决策树可…