局部 static 在函数内,为什么不是每次执行?因为 static 存储期,不是自动存储期,初始化只发生一次,这是语言语义。为什么不是运行时每次执行?因为 static 关键字意味着存储和生命周期是静态的,且初始化只发生一次。在常量表达式情况下,编译器知道值,可以直接把值放在目标文件的数据段,不需要在函数入口生成赋值语句。
含义:
- 性能:无每次函数调用检查/赋值的开销。
- 语义 :静态对象在程序开始前已初始化,即使函数没被调用也存在。其实局部
static对象即使函数未被调用,是否在程序启动时初始化?对于常量初始化,C++ 标准允许在静态初始化阶段进行,因此其初始化可能发生在main之前,即使函数从未被调用。但它的名字作用域仍限于函数内,生命周期持续到程序结束。 - C 语言:要求常量初始化,因此没有动态初始化,简化实现,适合嵌入式/系统编程。
- C++:区分常量初始化和动态初始化。常量初始化可以提前,动态初始化延迟到首次 odr-use/控制流到达,以支持局部惰性和依赖运行时。