赞
踩
在解释bss段与data段区别前,先来看下他们定义,以及内存中的位置。
虚拟地址空间
在32位x86的Linux系统中,虚拟地址空间布局如下图所示:
虚拟地址空间分布
bss段(bss segment):bss是Block Started by Symbol的简称,用来存放程序中未初始化的全局变量的内存区域,属于静态内存分配。
data段(data segment):用来存放程序中已初始化的全局变量的内存区域,属于静态内存分配。
text段(text segment):用来存放程序执行代码的内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。也有可能包含一些只读的常数变量,例如字符串常量等。
堆(heap):用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。
栈(stack):用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在data段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。
上面只是简单介绍了各个内存段,如果想详细了解,可以看这篇文章《深度解析内存中的程序》。
bss段与data段的区别
在初始化时 bss 段部分将会清零。bss 段属于静态内存分配,即程序一开始就将其清零了。
比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
text 和 data 段都在可执行文件中,由系统从可执行文件中加载;
而 bss 段不在可执行文件中,由系统初始化。
上面这些理论可能有些抽象,下面我们通过示例代码来对比两者区别。
示例代码
#include
int bss_1;// 未初始化的全局变量,bss段
int bss_2 = 0;// 初始化为0的全局变量,bss段
int data_1 = 1;// 初始化非0的全局变量,data段
int main() {
static int bss_3;// 未初始化的静态局部变量,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。