程序初始化数据段与非初始化数据段区分
| 分类: unix |
linux程序内存布局如下:
cout << a[2]
<< endl;
cout << a[2]
<< endl;
我们可以见到数据段分为初始化数据段和未初始化数据段(BSS: 这源于老版本的汇编语言助记符“block
started by symbol”)。它们的区别:
1.
初始化数据段是在程序中显式给了初始值的全局变量或静态变量。未初始化的数据段是在程序中没给初始值的全局变量或静态变量。
2. 初始化数据段的变量是会占用程序磁盘空间的,未初始化的数据段不会占用程序磁盘空间。
例子一:
#include
#include
using namespace std;
int a[10000] = {1};
int main()
{
}
大小: 57360
Sep 9 10:50 test
例子二:
#include
#include
using namespace std;
int a[10000];// = {1};
int main()
{
}
大小 :17296 Sep 9 10:51 test
===
从上面例子看出,显式初始化了数组后,程序大小多了近40000字节,即初始化数据段是和程序正文一起占用磁盘空间;而未初始化的数组,不占用磁盘空间,在程序加载时,由操作系统将整个段初始化为0。
3. 既然初始化数据段是和正文一起占磁盘空间,那么初始化数据段和正文段相邻也就很明显了
前一篇:类成员函数与this指针

加载中…