动态初始化-跨翻译单元
C++ Dynamic initialization - across translation units
c++ 98语言标准规定:(强调)
3.6.2非本地对象的初始化
£1[…]Zeroinitialization和用常量表达式初始化的统称称为静态初始化;所有其他初始化都是动态初始化。[…]
£3[…]它是由实现定义的namespace作用域的对象的动态初始化(8.5、9.4、12.1、12.6.1)是否在main的第一个语句之前完成。如果初始化延迟到main语句的第一个语句之后的某个时间点,它应该发生在与待初始化对象在同一翻译单元中定义的任何函数或对象的第一次使用之前。[…]
在我的办公室,我们对黑体字的段落有两种解释…
我的问题是:有一个类有一大堆静态方法和动态初始化的静态数据成员。在动态初始化完成之前,这个类中的静态方法可以(或者不能)从另一个翻译单元调用吗?
谢谢!
[编辑:]
也许这可以归结为"它应该发生"的解读:
- 应已开始
- 应已完成
在动态初始化完成之前,这个类中的静态方法可以(或不能)从另一个翻译单元调用吗?
黑体字的段落很清楚,不是吗?这些数据的初始化保证在第一次使用的任何函数或类之前发生。从调用函数并不重要。保证在翻译单元中的任何函数第一次使用之前进行初始化。当然,它们可以从另一个翻译单元被称为,但这没有任何区别。在输入这个转换单元中定义的函数之前,必须执行初始化。
换句话说,你很安全。
…
假设是单线程执行,即。c++ 98在多线程环境中没有提供任何保证,因此对于线程应用程序,上述保证通常只是意味着初始化将由使用该转换单元的函数或类的第一个线程执行。然后,当执行初始化时,您有一个竞争条件,其他线程可能会碰到部分初始化的数据。
相关文章:
- 不同翻译单元中不可重载的非内联函数定义
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 如何执行 cppcheck 交叉翻译单元 (CTU) 静态分析?
- 模板变量是否允许在多个翻译单元中并有效合并?
- 是否允许类在程序中的不同翻译单元之间具有不同的定义?
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 为什么不同的翻译单元没有独立和沙盒的内存空间?
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 来自不同翻译单元的函数会干扰吗?
- 如何在C++中的不同翻译单元之间共享枚举的实例
- 在C++中声明"interface",而不是将其 vtable 发送到每个翻译单元
- MSVC 2017 在单个翻译单元中违反静态初始化顺序
- 在不同的翻译单元中启动全局变量(涉及链接)
- 链接器如何处理跨翻译单元的相同模板实例化
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- 翻译单元的数量与CPP文件的数量
- GCC 6.3.0 中的 ODR 冲突,类型在两个单独的翻译单元中定义
- 为什么结构和类定义可以在多个翻译单元上重复?
- 如果在同一翻译单元中调用功能,为什么需要搬迁