在计算机程序的内存布局中,bss段和.data段都是用于存储全局变量和静态变量的区域,但它们的用途和特性不同。区分它们的主要原因是优化可执行文件的大小和初始化效率。
- .data段:
- 存储已初始化的全局变量和静态变量。
- 这些变量在程序开始运行之前就已经有了初始值。
- 这些初始值需要存储在可执行文件中,因此会增大可执行文件的体积。
- .bss段:
- 存储未初始化的全局变量和静态变量(在C语言中,未显式初始化的全局变量和静态变量会被系统初始化为0或空指针)。
- 这些变量在程序开始运行之前并没有具体的初始值(或者说是0值)。
- 可执行文件中只需要记录bss段的大小,而不需要存储大量的0值,因此可以减小可执行文件的体积。
为什么要区分?
- 节省磁盘空间:对于未初始化的变量,我们不需要在可执行文件中存储它们的初始值(因为都是0),只需要在程序加载时分配相应大小的内存并初始化为0即可。这样,可执行文件的大小会减小。
- 提高加载效率:在程序加载时,操作系统可以根据bss段的大小快速分配内存并初始化为0,而不需要从可执行文件中读取大量的0值数据。
历史背景:
bss是“Block Started by Symbol”的缩写,起源于古老的汇编语言。在早期的计算机系统中,内存和磁盘空间都非常有限,因此这种区分对于节省资源非常重要。
现代编程中的注意事项:
- 在C语言中,未初始化的全局变量和静态变量默认初始化为0(或空指针),因此它们被放在bss段。
- 注意,局部变量不在.data或bss段中,它们位于栈上。