加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

程序初始化数据段与非初始化数据段区分

(2022-09-09 10:51:58)
分类: unix
linux程序内存布局如下:


我们可以见到数据段分为初始化数据段和未初始化数据段(BSS: 这源于老版本的汇编语言助记符“block started by symbol”)。它们的区别:

1. 初始化数据段是在程序中显式给了初始值的全局变量或静态变量。未初始化的数据段是在程序中没给初始值的全局变量或静态变量。
2. 初始化数据段的变量是会占用程序磁盘空间的,未初始化的数据段不会占用程序磁盘空间。
例子一:
#include
#include
using namespace std;

int a[10000] = {1};

int main()
{
   cout << a[2] << endl;
}

大小:  57360 Sep  9 10:50 test

例子二:
#include
#include
using namespace std;

int a[10000];// = {1};

int main()
{
   cout << a[2] << endl;
}

大小 :17296 Sep  9 10:51 test
===
从上面例子看出,显式初始化了数组后,程序大小多了近40000字节,即初始化数据段是和程序正文一起占用磁盘空间;而未初始化的数组,不占用磁盘空间,在程序加载时,由操作系统将整个段初始化为0。

3. 既然初始化数据段是和正文一起占磁盘空间,那么初始化数据段和正文段相邻也就很明显了





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有