首先,我们需要明白C++程序编译链接后会包含以下几个主要段(Section)。
- 代码段(
.text
):存放程序的可执行代码,通常是只读的- 数据段(
.data
):存放已初始化的全局变量和静态变量- BSS段(
.bss
):存放未初始化的全局变量和静态变量。这些变量在程序启动时自动初始化为0。- 只读数据段(
.rodata
):存放只读的全局变量和常量,比如字符串字面量和 const 变量- 动态链接信息段(
.dynamic
,.plt
,.got
):用于支持动态库的加载和链接- 符号表和字符串表段(
.symtab
,.strtab
):存放符号表和字符串表信息
从上述的编译后分段就可以看出来,只有BSS段的内容会被自动初始化为0,那么C++中的哪些数据会再编译链接后放入BSS段呢?就是全局变量和静态变量。
一、全局变量
int g_global; // 初始化为0
二、全局静态变量
static int g_static; // 初始化为0
三、局部静态变量
int main() {// 局部静态变量static int s_local; // 初始化为0
}
四、类中的静态变量
// 类的成员变量
class Example {
public:int member; // 不会自动初始化static int static_member; // 初始化为0
};
int Example::static_member; // 初始化为0