【发布时间】:2010-12-26 23:12:48
【问题描述】:
我在我的 unix 教科书中读到 bss 用于存储未初始化的变量(全局声明)。这意味着静态变量是单独存储的,而不是在 bss 中。唯一的其他地方是数据段。
这是我的问题:bss 段是数据段的一部分,还是它们是两个完全不同的内存段集? 还有,为什么要把全局变量和静态变量分开?
【问题讨论】:
我在我的 unix 教科书中读到 bss 用于存储未初始化的变量(全局声明)。这意味着静态变量是单独存储的,而不是在 bss 中。唯一的其他地方是数据段。
这是我的问题:bss 段是数据段的一部分,还是它们是两个完全不同的内存段集? 还有,为什么要把全局变量和静态变量分开?
【问题讨论】:
最初的想法仍然存在,尽管在它上面对本地符号、小型引用、共享库等进行了混淆处理。
但一切仍然基于最初的简单模型,因此值得了解。这个想法是有三个部分。
Bss 很特别:.bss 对象在对象文件中不占用任何空间,并且通过将所有未专门初始化的符号组合在一起,可以轻松地将它们一次清零。
静态有几个含义。从某种意义上说,它只是一个符号属性,它告诉链接器它是对象模块的本地对象还是可以与其他同名符号全局链接。它还用于指定存储持续时间,以区分函数内的对象和自动(堆栈分配的)对象。
因此,静态变量可以在 data 或 bss 中,具体取决于它是否已初始化,全局变量也可以。
【讨论】:
bss 传统上是所谓的未初始化变量,但 C 和 Unix 保证它们被初始化为零。 (参见this。)它是数据段的一部分,通常紧跟在程序静态初始化变量空间之后。比 bss 高的内存通常是堆的开头。
【讨论】: