C程序的内存布局

3
我正在阅读这篇文章:http://www.geeksforgeeks.org/memory-layout-of-c-program/,它说“未初始化变量存储在bss中”,“已初始化变量存储在数据段中”。
我的问题是为什么我们需要为变量拥有2个单独的段?1. BSS 2. 数据段?
为什么不把所有内容都放入一个段中呢?
2个回答

4

BSS占用程序映像中的空间很少。它只是指示BSS部分有多大,运行时将把该内存设置为零。

数据段填充变量的初始值,因此在程序映像文件中占据空间。


1
据我所知,未初始化的变量(在.bss中)在进入程序时被清零。初始化变量(.data)则会得到一个特定的值。
这意味着在您的程序可执行文件(存储在磁盘上)中,必须逐字节包含.data段(因为每个变量都有可能具有不同的值)。然而,bss不需要逐字节保存。只需要在加载可执行文件时知道要保留的内存大小即可。程序知道.bss中每个变量的偏移量。
为了清零所有未初始化的变量,可以使用一些汇编指令(例如对于x86:rep stosw和一些寄存器设置)。
结论:.data的加载和初始化时间比大型.bss段要差得多,因为.data必须从磁盘加载,而.bss只需要通过非常少的CPU指令即可实时保留。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接