关于未初始化全局变量

时间:2021-01-04 19:42:18

前几天发现未初始化全局变量一些特性,后来在一篇博客上发现有人说过这个问题

这是原博文地址 blog.csdn.net/liuqiaoyu080512/article/details/8455652

然后结合原博文,自己又做了几个实验

以下算是自己实验一遍以后的总结:

首先,自己曾经以为未初化的全局变量也要在程序(不是正在运行的进程)中占有空间,但是后来发现这是错的. 未初始化的全局变量获得相应大小的空间应该是在操作系统创建进程的时候分配(且是分配heap堆内的空间,不是DATA数据段), 和指针的初始化需要手动完成相比,这是自动的.(还有就是部分初始化和初始化的效果是一样的)


int kross[1024*1024]={0,1};
int main(){
 return 0;
}

这样编译完以后的结果:

关于未初始化全局变量

我们发现test(编译完以后的out文件)的文件大小是包含部分初始化全局变量的


当我们不初始化时

int kross[1024*1024];
int main(){
 return 0;
}

结果是:

关于未初始化全局变量

以上说明编译器在编译的时候会根据全局变量是否初始化而做出储存空间优化


2,未初始化全局变量的空间分配会自动完成

先运行test文件,然后ps -a找到test的pid,再根据pid查看进程的详细状态:

关于未初始化全局变量

从图中可以发现VmData的大小是包含变量的大小的


相反当我们将变量改为指针时,这个时候VmData的大小就变小了,操作系统没有自动分配

关于未初始化全局变量


还有就是原博文说初始化了的变量在创建进程时VmData的大小也不大,主要是由于操作系统不是将一个程序完全加载到内存