c - 关于Unix中的bss段和data段

标签 c unix memory

我在我的 unix 教科书上读到 bss 用于存储未初始化的变量(全局声明)。这意味着静态变量是单独存储的,而不是在 bss 中。唯一的其他地方是数据段。

这是我的问题:bss 段是数据段的一部分还是它们是两个完全不同的内存段集? 另外,为什么要将全局变量与静态变量分开?

最佳答案

最初的想法仍然存在,尽管在它之上有针对本地符号、小引用、共享库等的混淆层。

但是一切还是基于原来的简单模型,所以值得了解。这个想法是分为三个部分。

  • .text
    这有程序代码。
  • .data
    这有初始化数据。
  • .bss
    这有未初始化的数据。

Bss 的特殊之处在于:.bss 对象在目标文件中不占用任何空间,通过将所有未专门初始化的符号组合在一起,可以轻松地将它们一次清零。

静态有几个含义。从某种意义上说,它只是一个符号属性,告诉链接器它是局部于目标模块还是可以与其他同名符号全局链接。它还用于指定存储持续时间,以将函数内的对象与自动(堆栈分配)对象区分开来。

所以静态变量可以在 data 或 bss 中,这取决于它是否被初始化,全局变量也是如此。

关于c - 关于Unix中的bss段和data段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909953/

相关文章:

python - 如何使 C 包装器(用 32 位 Python 编写)在运行 64 位 Python 的新机器上工作?

linux - Unix shell 脚本参数的默认值?

C 程序 Printf 函数显示 unsigned long long 类型的异常行为?

c++ - Visual C++ 6.0 中 "unsigned char"数组的最大允许大小是多少?

android - 将静态变量保留更长的时间 - Android

c - 本地指针的奇怪行为

c - 如何在 C 中定义构造函数

c++ - Unix C++ 简单服务器问题 : sending data back to browser

memory - 谷歌云平台 : how to monitor memory usage of VM instances

c - 在内部使用带有函数指针的结构成员