程序如何知道静态变量是否需要初始化?
How does program know if static variable needs to be initialized?
如标题所示 - 程序如何知道,第二次调用函数时foo
已经初始化:
int getFoo()
{
static int foo = 30;
return foo;
}
int main()
{
getFoo();
getFoo();
}
我想知道,程序是否存储了一些关于哪个静态变量已经初始化的附加信息。
编辑:
我在这里找到了一个答案:
为什么本地静态对象的初始化使用隐藏的防护标志?
就像我猜的那样 - 大多数编译器存储额外的"保护变量"。
看看 [stmt.dcl]/4:
具有静态存储持续时间
- 或线程存储持续时间的块范围变量的动态初始化在控件第一次通过其声明时执行;此类变量在其初始化完成后被视为已初始化。如果初始化通过引发异常退出,则初始化未完成,因此下次控件进入声明时将再次尝试初始化。如果控件在初始化变量时同时输入声明,则并发执行应等待初始化完成。94 如果在初始化变量时控件以递归方式重新输入声明,则行为是未定义的。
在这里你必须小心。 原始static
在编译时初始化(只要初始化值是编译时常量,正如 Peter 指出的那样(,所以在你的示例中,GetFoo
实际上只是返回一个常量。
然而。。。
初始化对象(或通过调用函数初始化原语(的static
在首次输入声明它们的作用域时执行所述初始化。
此外,从 C++ 11 开始,这必须以线程安全的方式完成,这会生成大量额外的代码(尽管在第一次通过后没有太多的运行时开销(,这可能是一个问题,例如,代码大小通常很重要的微控制器。
下面是一个具体的例子:
#include <iostream>
struct X
{
X () { std::cout << "Initialising mn"; m = 7; }
int m;
};
void init_x ()
{
static X x;
}
int main () {
std::cout << "main calledn";
init_x ();
std::cout << "init_x returnedn";
}
输出:
main called
Initialising m
init_x returned
现场演示:https://wandbox.org/permlink/NZApcYYGwK36vRD4
生成的代码:https://godbolt.org/z/UUcL9s
相关文章:
- 列表初始化是否将原子初始化为零
- 使用函数声明进行函数指针初始化 - 是否可能
- 值初始化是否适用于原子对象?
- 聚合的值初始化是否使用其成员的默认初始值设定项?
- C 11联合会的空列表初始化 - 是否保证可以初始化工会的全长
- 找出静态初始化是否结束
- 非本地非内联变量的初始化:是否严格在"main()"函数调用之前进行
- 空字符数组的初始化是否有效
- 变量零初始化-是否有未定义的行为
- 0-原子的初始化是否保证将值成员设置为0
- POD 类对象初始化是否需要构造函数
- 在C++中使用类似 c 的初始化或构造函数初始化是否被认为更好
- 类内成员初始化是否删除赋值运算符
- C++11;非静态数据成员初始化是否可以访问其他数据成员
- 列表初始化是否为隐式转换
- 复制列表初始化是否在概念上调用复制 ctor
- 如何测试/验证零初始化是否发生
- C++默认初始化是否保留先前的零初始化
- 使用新结构体进行聚合初始化是否有效
- 检测CRT初始化是否在注入过程中完成