"local scope"中的 C++ 初始化静态变量

c++ initialization static variable in "local scope"

本文关键字:静态 变量 初始化 中的 local scope C++      更新时间:2023-10-16

静态变量在程序开始时初始化,如此处所述,静态变量的初始化顺序是未定义的。因此,用一个静态变量初始化另一个静态变量可能会导致程序崩溃。

在函数中声明的"局部"静态变量是否也成立?

使用全局声明的静态变量来初始化"局部"静态变量是否安全?

如果我在同一局部范围内有多个静态变量,那么使用早期声明的变量来初始化后期声明的变量是否安全?

具有静态存储持续时间的变量,其中初始值在编译时已知,零初始化或常量初始化是静态初始化,并在其他所有内容之前初始化(在 C++11 及更早的标准修订版中,常量初始化之前初始化为零(。毕竟,如果编译器和链接器确切地知道在编译时该变量中的值是什么,为什么它们不把值放在那里呢?

静态初始化的变量不是问题。如果要分配常量或零,则变量不依赖于其他任何内容。这就留下了动态初始化,如果我正确阅读了C++标准中的[basic.start.static],则静态初始化都发生在任何翻译单元的任何动态初始化之前。问题在于动态初始化的变量,静态存储持续时间在多个翻译单元之间交互。您可以按定义顺序保证翻译单元内的初始化顺序,但不能保证翻译单元的初始化顺序。

函数中声明的"局部"静态变量是否也成立?

不。static局部变量具有明确定义的初始初始化顺序。动态初始化将在首次使用时发生,并且不能跨翻译单元拆分,这消除了非本地初始化顺序中的歧义。

如果我在同一局部范围内有多个静态变量,那么使用早期声明的变量来初始化后期声明的变量是否安全?

是的。同样,我们有一个明确定义的初始化顺序。动态初始化的变量将按顺序初始化,静态初始化的变量已经初始化。你可以用线程搞砸它,但C++11,更好地确保一个线程不能中断静态变量的初始化。如果线程在两个静态变量的初始化之间中断,则是否安全取决于您,但第一个变量仍将在第二个变量之前初始化。

使用全局声明的静态变量来初始化"局部"静态变量是否安全?

并非总是如此。一个非局部变量在main之前被分配和初始化,所以通常它们在你有机会调用包含静态局部变量的函数之前被初始化并准备好使用。

但是,使用包含静态变量的函数进行初始化,该函数依赖于来自不同翻译单元的变量呢?

说在 A 中.cpp我们有

int A_variable  = something_dynamic();

在 B 中.cpp我们有

int  func()
{
static int local_static = A_variable;
return local_static;
}
int B_variable = func();

B_variable的初始化可能在初始化A_variable之前进行。这将调用func并将local_static设置为B_variable中尚未定义的值。哎呀。