问题描述
我一直看到同样的一句话,静态变量只初始化一次,我还看到一句话说“第一次进入块时”。
局部静态变量是否像其他全局变量一样初始化 - 在程序执行开始时?或者局部静态变量是否与普通全局变量不同,并且只有在调用/到达它们的函数/块后才会被初始化?
解决方法
C17 6.2.4 (3)
一个对象,其标识符的声明没有使用存储类说明符 _Thread_local
,并且
具有外部或内部链接或存储类说明符 static
,具有静态存储持续时间。
它的生命周期是程序的整个执行过程,它的存储值只初始化一次,之前
程序启动。
但是,请记住 as-if 规则。一个实现可能等到第一次调用函数时才初始化变量,因为在此之前符合标准的程序无法访问它的值,因此无法区分。 >
如果您的实现具有扩展或实现定义的行为,确实提供了在第一次调用函数之前访问变量的方法,那么这样的实现应该记录您是否会在这种情况下看到初始化值.在大多数情况下,我希望答案是“是”。
我熟悉的最常见的实现是从可执行文件加载初始值,或者将它放在启动时清零的 bss
部分,就像对全局或文件范围所做的那样static
变量。
尽管依赖于实现,静态变量 - 任何范围 - 都会在加载可执行文件时初始化。