我在Unix课本上读到,bss用于存储未初始化的变量(全局声明)。这意味着静态变量是单独存储的,而不是在bss中。唯一的其他地方是数据段。
我的问题是:bss段是数据段的一部分还是它们是完全不同的内存段?此外,为什么要将全局变量与静态变量分开存储?
虽然对于本地符号、小型引用、共享库等内容进行了层层混淆,但原始思想仍然存在。
不过一切仍然基于原始的简单模型,因此值得了解。这个想法是有三个段落的:
而.bss则很特殊:它的对象在对象文件中不占用任何空间,并且通过将所有未明确初始化的符号分组在一起,可以轻松将它们全部清零。
静态有几个含义。在某种意义上,它只是一个符号属性,告诉链接器它是对象模块局部的还是可以与同名的其他符号进行全局链接的。它也用于指定存储期限,以区分函数内的对象和自动(堆栈分配)对象。
因此,静态变量可以是初始化或未初始化的,全局变量也可以是如此,具体取决于它是否被初始化。
bss
传统上被称为未初始化的变量,但 C 和 Unix 保证它们被初始化为零。(参见this。)它是数据段的一部分,通常位于程序静态初始化变量空间的右侧。在内存中比 bss 更高的位置通常是堆的开始。