"local scope"中的 C++ 初始化静态变量
c++ initialization static variable in "local scope"
静态变量在程序开始时初始化,如此处所述,静态变量的初始化顺序是未定义的。因此,用一个静态变量初始化另一个静态变量可能会导致程序崩溃。
在函数中声明的"局部"静态变量是否也成立?
使用全局声明的静态变量来初始化"局部"静态变量是否安全?
如果我在同一局部范围内有多个静态变量,那么使用早期声明的变量来初始化后期声明的变量是否安全?
具有静态存储持续时间的变量,其中初始值在编译时已知,零初始化或常量初始化是静态初始化,并在其他所有内容之前初始化(在 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
中尚未定义的值。哎呀。
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 模板基类中的静态变量
- 类和静态变量
- 不同作用域中的静态变量和全局变量
- 静态变量声明和定义
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在类中继承静态变量?
- "local scope"中的 C++ 初始化静态变量
- 使用静态变量的递归调用的不同输出
- 复制文件流C++静态变量
- 跨模板化函数编译的静态变量
- C++编译器是否优化了顺序静态变量读取?
- C++,每个循环初始化一个新的静态变量
- (为什么)我们可以在初始化中将非静态类成员分配给静态变量吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- 程序如何知道静态变量是否需要初始化?
- 类外的静态变量实例化
- 无法解析静态变量
- 函数局部静态变量:从性能角度来看的优点/缺点
- 访问从 CPP 文件到其他头文件的静态变量