C++中函数内的静态变量 - 即使函数没有运行也会分配?

Joh*_*n C 17 c++ static memory-management

我一直在网上阅读C++,这是我无法找到答案的一件事.

我知道函数中使用的静态变量类似于全局变量,并且该函数的后续调用将使静态变量在调用之间保持其值.

但是,如果从未调用该函数,静态变量是否会被分配?

谢谢

lea*_*der 16

如果函数没有被调用,很可能是你的连接将deadstrip两者的功能和静态变量,防止其进入.rodata,.data.bss段(或你的可执行文件格式的当量).

但是,有多种原因导致链接器可能没有死区(标志告诉它不能,无法确定取决于符号的内容等).

这是值得检查你的链接器映射文件(有时只是一个文本文件!),或使用objdump,nmdumpbin看到最后的可执行公用事业如果符号或相关的符号(如静态初始化代码)存活.

  • *注意:.rodata,.data和.bss是特定于unix的.(但+1) (2认同)

小智 8

C++标准,第6.7节说:

具有静态存储持续时间(3.7.1)的所有本地对象的零初始化(8.5)在任何其他初始化发生之前执行.具有使用常量表达式初始化的静态存储持续时间的POD类型(3.9)的本地对象在其首次输入块之前被初始化.允许实现在允许实现静态初始化具有命名空间范围内的静态存储持续时间的对象的相同条件下,以静态存储持续时间执行其他本地对象的早期初始化(3.6.2).否则,在第一次控制通过其声明时初始化这样的对象; 这样的对象在初始化完成时被认为是初始化的.

这表示本地静态对象通常在控制流第一次遇到它们时初始化.但是,它们可能在此之前被分配 - 除了引用静态对象生命周期之外,标准对静态存储实际上有些保持沉默.