引入:初始化为0的全局变量和静态局部变量真的在.data段吗?
从网上和书上看到的理论都是这么说的:编译阶段结束之后,初始化的全局变量和静态局部变量放在.data段的,而未初始化的全局变量和静态局部变量则是放在了.bss段,今天,饶有兴趣实测了一把,发现似乎有种情况没探讨到,那就是如果初始化的值为零呢?按理说,初始化为零也是初始化,应该在.data段,可实际,并没有,以下测试均在Linux的GCC编译器下进行:
测试代码一,初始化为0:
#include <stdio.h>
int a[1024] = {0};
int main()
{
return 0;
}
编译完成之后,查看ELF文件大小:
测试代码二,初始化为1:
#include <stdio.h>
int a[1024] = {1};
int main()
{
return 0;
}
编译完成之后,查看ELF文件大小:
同样测试了静态局部变量的情况下,和此情况吻合;
从实际测试的情况可以确认,初始化为0的全局变量和静态局部变量是在.bss区的,也许,是编译器对此做了优化,因为,全局变量和静态局部变量默认也是零的,既然都是零,那么,考虑到.data是会在编译阶段就会确定大小,为了节约空间,就将两种情况都优化到了.bss段里面了,当然,优化这个只是本人猜测了,但真正需要掌握的,是程序的.data段是在编译阶段就确定大小,而.bss段不过是预留了程序位置而已。