我想知道幕后到底发生了什么,编译器如何处理静态变量。与自动变量不同,静态变量的值即使在块结束后仍然存在,但是编译器实际上如何处理这个问题?
与堆栈上的局部变量不同,静态变量保存在特殊的数据段中。静态变量转到哪个段取决于它们是否初始化为 0。 0 初始化的静态数据进入.BSS(Block Started by Symbol),非0初始化数据进入.DATA.
如果您想了解可执行文件中不同段的更多信息,this维基百科条目是一个很好的起点。我也强烈推荐第七章计算机系统:程序员的视角作者:兰德尔·E·布莱恩特和大卫·R·奥哈拉伦。
我在这里描述一个特定的场景。您需要考虑到细节会因一种架构而异、从一种操作系统到另一种操作系统等而有所不同。但是,可执行文件的总体布局仍然如所描述的那样。确实是令人兴奋的事情!
EDIT:
作者恳请我澄清:
将 0 初始化变量划分为 .bss 和有什么意义
非0初始化为.data?
来自第 7.4 节计算机系统:程序员的视角 on the .BSS部分:
该部分在目标文件中不占用实际空间;这仅仅是
占位符。对象文件格式区分已初始化
和未初始化的变量以提高空间效率:uninitialized
变量不必占用对象中的任何实际磁盘空间
文件。
并且,从维基百科:
通常只有长度.BSS部分,但没有存储数据
在目标文件中。程序加载器分配并初始化
加载程序时 bss 部分的内存。
总结一下:这是一种节省内存的机制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)