C++ 标准第 3.6.2 节第 3 段指出,非本地对象的动态初始化是否发生在 main() 的第一条语句之后是实现定义的。
有谁知道这样做的基本原理是什么,以及哪些编译器以这种方式推迟非局部对象初始化?我最熟悉 g++,它在进入 main() 之前执行这些初始化。
这个问题是相关的:Dynamic initialization phase of static variables 但我特别想问的是,已知哪些编译器会以这种方式运行。
这一段的唯一理由可能是支持在运行时加载动态库,但我认为标准没有考虑动态加载问题。
最佳答案
其中一个原因可能是:
static char data[1000000000000000000000000000000];
void main(int argc)
{
if (argc > 0)
data[0] = 0;
}
只有当确实需要时才分配和初始化这个静态数组可能是合理的。某些应用程序可能会遇到类似的情况,并且有足够的发言权来说服委员会。根据我自己使用 C# 的经验,我遇到过类的静态成员在 jitting 类后没有立即分配的情况。它们是在第一次使用时一个一个分配的。在那种情况下,绝对没有理由这样做。这简直就是一场灾难。也许他们现在解决了这个问题。
其他原因也是可能的。
关于C++ 编译器在 main 之后实现动态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11111568/