我在我的 unix 教科书上读到 bss 用于存储未初始化的变量(全局声明)。这意味着静态变量是单独存储的,而不是在 bss 中。唯一的其他地方是数据段。
这是我的问题:bss 段是数据段的一部分还是它们是两个完全不同的内存段集? 另外,为什么要将全局变量与静态变量分开?
最佳答案
最初的想法仍然存在,尽管在它之上有针对本地符号、小引用、共享库等的混淆层。
但是一切还是基于原来的简单模型,所以值得了解。这个想法是分为三个部分。
- .text
这有程序代码。 - .data
这有初始化数据。 - .bss
这有未初始化的数据。
Bss 的特殊之处在于:.bss 对象在目标文件中不占用任何空间,通过将所有未专门初始化的符号组合在一起,可以轻松地将它们一次清零。
静态有几个含义。从某种意义上说,它只是一个符号属性,告诉链接器它是局部于目标模块还是可以与其他同名符号全局链接。它还用于指定存储持续时间,以将函数内的对象与自动(堆栈分配)对象区分开来。
所以静态变量可以在 data 或 bss 中,这取决于它是否被初始化,全局变量也是如此。
关于c - 关于Unix中的bss段和data段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909953/