动态初始化

hmj*_*mjd 4 c++

C++ 03标准[basic.start.init]第3点指出:

它是实现定义的,无论命名空间作用域的对象的动态初始化(8.5,9.4,12.1,12.6.1)是否在main的第一个语句之前完成.如果初始化延迟到main的第一个语句之后的某个时间点,则它应该在第一次使用与要初始化的对象相同的转换单元中定义的任何函数或对象之前发生.

根据Additional Startup Considerations,Microsoft Compilers在执行之前执行初始化main().

我无法获得说明GNU和Sun Forte编译器行为的文档.

谁能:

  1. 请指出描述GNU和Forte编译器在动态初始化方面的行为的文档方向(我已经检查过GCC手册,但没有发现任何与动态初始化有关的内容).
  2. 评论延迟动态初始化的线程安全性(如果两个线程尝试从包含非本地对象的同一转换单元调用函数).

FWIW,我观察了GNU的g ++和SUN的CC的行为,并且都在main之前进行了初始化,尽管我不接受这个作为确定的答案.(我可以发布我以前用来观察的非常简单的代码,如果有人有兴趣,但我觉得这个问题足够长了)

Jam*_*nze 5

确定的答案是所有编译器之前都进行静态初始化main,除非对象位于稍后加载的DLL中.在实践中,(几乎)不可能满足您引用的文本中的要求.(想想如果有一个循环会发生什么.)