gpt4 book ai didi

c++ - 静态变量初始化顺序

转载 作者:IT老高 更新时间:2023-10-28 13:22:38 30 4
gpt4 key购买 nike

C++ 保证编译单元(.cpp 文件)中的变量按声明顺序进行初始化。对于编译单元的数量,此规则分别适用于每个编译单元(我的意思是类之外的静态变量)。

但是,变量的初始化顺序在不同的编译单元之间是未定义的。

我在哪里可以看到有关 gcc 和 MSVC 的这个顺序的一些解释(我知道依赖它是一个非常糟糕的主意 - 这只是为了了解我们在迁移到新的 GCC 专业时遗留代码可能遇到的问题和不同的操作系统)?

最佳答案

正如你所说,不同编译单元之间的顺序是不确定的。

在同一个编译单元内,顺序是很好定义的:与定义相同的顺序。

这是因为这不是在语言级别而是在链接器级别解决的。所以你真的需要查看链接器文档。虽然我真的怀疑这是否会有所帮助。

对于 gcc:查看 ld

我发现即使更改链接的对象文件的顺序也可以更改初始化顺序。因此,您需要担心的不仅仅是链接器,还有构建系统如何调用链接器。甚至尝试解决问题实际上是行不通的。

这通常仅在初始化在其自身初始化期间相互引用的全局变量时才会出现问题(因此仅影响具有构造函数的对象)。

有一些技术可以解决这个问题。

  • 延迟初始化。
  • Schwarz Counter
  • 将所有复杂的全局变量放在同一个编译单元中。

  • 注1:全局变量:
    松散地用于指代可能在 main() 之前初始化的静态存储持续时间变量。
  • 注意 2:可能
    在一般情况下,我们希望静态存储持续时间变量在 main 之前初始化,但在某些情况下允许编译器延迟初始化(规则很复杂,详见标准)。

关于c++ - 静态变量初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/211237/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com