BSS段、数据段和代码段

来源:互联网 发布:学java还是学python 编辑:程序博客网 时间:2024/04/27 23:06

一个可执行程序包括BSS段,数据段代码段(又称文本段)。

bss segment ,data segment ,code/text segment

BSS(Block by Start Symbol) :通常指用来存放程序中未初化的全局变量和静态变量的一块内存区域。

BSS段属于静态内存分配

特点是:可读写的,在程序执行之前BSS段为自动清零,所以未初始的全局变量在程序执行之前已经成零了。

_________________________________________________________________________________

数据段:通常用来存放程序中已初始化的全局变量和静态变量的一块内存区域。

DATA segment 属于静态内存分配。


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


堆(heap):用于存放程序中被动态分配的内存段,大小不固定,可动态扩大或缩减, malloc /free 

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


DEMO:

program 1:

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

program 2:

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

在VS中跑了一下这两段代码,发现program 1编译出来的.exe的大小为28KB,program 2编译出来的.exe的大小为172KB.

区别在于一个位于BSS段,另一个位于DATA段。两者的区别在于:全局的未初始化变量存在于.bss段,具体体现为一个点位符;全局的已初始化变量存于.data段,而函数内的自动变量在栈上分配存储空间。.bss段是不占用.exe文件空间的,其内容由操作系统初始化为0,而.data段却需要占用,其内容由程序进行初始化,所以造成了上述情况。



bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。

data段(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。

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