【问题标题】:When are LOCAL static variables initialized本地静态变量何时初始化
【发布时间】:2021-05-25 17:27:48
【问题描述】:

我一直看到同一句话说静态变量只初始化一次,我也看到一句话说“当第一次进入块时”。

局部静态变量是否像其他全局变量一样在程序执行开始时初始化?还是局部静态变量与普通全局变量不同,只有在调用/到达它们的函数/块时才被初始化?

【问题讨论】:

  • 请注意,C++ 中的静态初始化与 C 中的静态初始化非常不同。如果您不仔细检查正在讨论的语言,您可能会感到非常困惑。我怀疑你“也看到”这句话不是关于 C 的。

标签: c


【解决方案1】:

C17 6.2.4 (3)

一个对象,其标识符被声明为没有存储类说明符_Thread_local,或者 具有外部或内部链接或存储类说明符static,具有静态存储持续时间。 它的生命周期是程序的整个执行过程,它的存储值只初始化一次,之前 程序启动。

但是,请记住 as-if 规则。实现可以等待初始化变量,直到第一次调用该函数,因为在此之前符合规范的程序无法访问其值,因此无法区分。 p>

如果您的实现具有扩展或实现定义的行为,它们确实提供了在第一次调用函数之前访问变量的方法,那么这样的实现应该记录在这种情况下您是否会看到初始化值.在大多数情况下,我希望答案是“是”。

我熟悉的最常见的实现是从可执行文件加载初始值,或者将其放在启动时归零的 bss 部分中,就像对全局或文件范围 @987654324 所做的那样@变量。

【讨论】:

  • 一个具体的例子是,在动态加载的库中的函数中定义的静态对象在加载库之前不会初始化。该程序可能会在不使用库的情况下启动并运行一段时间(甚至结束)。当它确实使用该库时,该库的静态对象将被初始化。
【解决方案2】:

虽然依赖于实现,但静态变量(任何范围)在加载可执行文件时都会被初始化。

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2010-12-22
    • 1970-01-01
    • 2010-09-26
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多