BSS是英文“Block Started by Symbol”的缩写,指的是以符号为开始的块。
在计算机领域中,BSS一般是指编译器把未初始化的全局变量和静态变量的存储空间以及未初始化的全局数组和静态数组的空间分配在一起的一块内存区域。
BSS是在程序装载前由操作系统清零的,它的初始化是在程序运行时进行的。
BSS的作用是给未初始化的变量和数组分配空间,这些变量和数组在程序运行时会被初始化。因此,BSS是程序数据段中非常重要的一部分。
不同于数据段,BSS只是给变量和数据分配了足够的空间,而并没有在编译时对其进行初始化,这使得BSS节省了空间,可以提高程序运行的效率。
编译器会将所有位于BSS中的变量标记为“未初始化”。在链接时,连接器会为这些变量分配内存空间并清零,从而将其初始化为0。
在运行期间访问BSS中的未初始化数据时,操作系统会根据需要将相应的页面映射到进程的虚拟地址空间。由于操作系统在映射页面时会自动清零,因此访问BSS中的未初始化数据在第一次进行时速度会比较慢。
BSS和数据段都是程序的数据段,但它们有明显的区别。
数据段中定义的变量在编译时会进行初始化,而BSS中的变量在编译时并没有初始化,只有在运行时才会被初始化。
数据段中的变量在ELF文件中有相应的占位符,已经占用了ELF文件的大小,而BSS中的变量并不占用ELF文件的大小,只是在程序运行时才分配相应大小的空间进行初始化。