如何理解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
进行改正