C++ 编译器在 main 之后实现动态初始化

标签 c++

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/

相关文章:

c++ - C++如何替换2D数组中的行和列?

c++ - 了解 Makefile 的依赖关系 (C++)

c++ - boost::shared_ptr 类结束时出错

c++ - 如何通过套接字发送所有数据?

c++ - 如何设置 float* 参数的默认值,它应该是指向数组的指针

c++ - 为什么 Doxygen 文档只出现在多个相邻组的最后一个?

c++ - Rand 在从最大为 75 的数字 (36) 开始时如何工作

c++ - 在 C++ 项目中使用 libjson

c++ - 为什么下面的类有一个虚拟表?

c++ - 是否可以使用 cv::VideoCapture 加载 32 位帧