.bss段和.data段引发的思考

引入:初始化为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段不过是预留了程序位置而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值