如何理解BSS段不占用可执行文件的磁盘空间

如何理解BSS段不占用可执行文件的磁盘空间

由来

今天在看一篇问题排查的文章时,文章里提到,由于作者和同事的编译环境的不同,导致两人用相同的源码编译出来的版本的BSS段不同(全局变量的存放的顺序不同),从而导致出现bug的情况;好奇之下,查了一下BSS段的资料,以此为记。
主要参考链接:
https://www.jianshu.com/p/52c7445af23a
https://www.cnblogs.com/kele-dad/p/9520639.html

什么是BSS,BSS的内容

BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了;
——注意:这里有的文章里表述不清,认为只有未经初始化的全局变量和静态变量才存放在BSS段,其实初始化为0的也会放在BSS段,可以通过上面的参考链接里的实验;

不占用磁盘

注意:这里说的是不占用磁盘,而不是不占用内存,这是2个不同的概念!
大家都知道,一个可执行文件生成后,未执行前,是只占用PC的硬盘空间,而不占用内存空间的;只有在执行时,才会申请和占用内存空间;也就是说,一个是静态(程序未执行时)的,一个是动态(程序执行时)的;
对BSS来说,静态时,是不占用可执行文件的大小的;而动态执行时,则会占用相应的内存空间;
从另一个方面来说,就是静态时是文件,动态时是进程;静态时的文件占用的是磁盘空间,动态时的进程占用的是内存空间;
——
从这里来看,就很容易理解未经初始化或者初始化为0 的全局变量或者静态变量可以不占用磁盘空间了——关键就在于未经初始化或者初始化为0——那就可以只存储大小和符号等信息,等执行时再分配相应的资源!
——本来还想多写一点的,奈何有个任务需要马上完成一下,暂时到此为止,我还有好几个点可以记录一下(费马不要告我侵权)

理解有问题,需要参考:
https://blog.csdn.net/xiaofei0859/article/details/50562984
进行改正

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lqw198421

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值