C++11是不是指定了静态/全局变量的构造顺序?

Posted

技术标签:

【中文标题】C++11是不是指定了静态/全局变量的构造顺序?【英文标题】:Does C++11 specify the construction sequence of static/global variables?C++11是否指定了静态/全局变量的构造顺序? 【发布时间】:2017-03-03 13:53:43 【问题描述】:

在 C++98/03 中,静态对象(在文件中、在类中、在函数中)的构造没有指定的顺序,一个静态对象不能假定它是在另一个静态对象之后或之前构造的,似乎是由链接器。

我的问题是,C++ 11/14 是否为静态对象和全局对象的构造序列指定了任何规则?

【问题讨论】:

这并不能回答问题,但 call_once (en.cppreference.com/w/cpp/thread/call_once) 为您提供了一种具体的方法。 不,在此期间没有任何变化 【参考方案1】:

规则没有改变。但是,所有全局/静态对象都是按照它们在翻译单元中出现的顺序构造的。只是多个翻译单元的初始化顺序是未指定的。

请注意,函数局部静态对象是以指定方式构造的。它们是在第一次达到声明时构建的,并且一直存在到程序结束。这种行为在 C++11 中有所改变,尽管在 C++11 之前初始化不是线程安全的,而 C++11 及更高版本指定静态初始化将是线程安全的。

【讨论】:

函数本地静态对象在第一次进入包含它们的作用域时被构造,这可能是在第一次进入函数之后——它甚至可以在函数的后续调用中(或不完全)如果该范围由例如控制if 条件在第一次调用函数时不成立。 @TonyD 已修复。你是对的,它们只有在达到初始化后才会被初始化。【参考方案2】:

是:全局对象将在编译单元内按顺序构造。 Ando No:C++11/14 没有改变。

【讨论】:

以上是关于C++11是不是指定了静态/全局变量的构造顺序?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 静态初始化顺序

java中的全局变量和静态变量是在编译时分配内存还是在加载时分配内存??

静态变量赋值问题

Java 中 cache 和 全局静态变量的 区别 优点缺点,希望不要全拷贝的答案。

打印C中所有全局和静态变量的值?

静态块非静态块(方发体)以及构造方法的执行顺序