静态初始化命令惨败

static initialization order fiasco(静态初始化命令惨败)

本文介绍了静态初始化命令惨败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从一本书中读到关于 SIOF 的信息,它举了一个例子:

I was reading about SIOF from a book and it gave an example :

//file1.cpp
extern int y;
int x=y+1;

//file2.cpp
extern int x;
int y=x+1;  

现在我的问题是:
在上面的代码中,会发生以下事情吗?

Now My question is :
In above code, will following things happen ?

  1. 在编译 file1.cpp 时,编译器将 y 保留原样,即不为其分配存储空间.
  2. 编译器为 x 分配存储空间,但不初始化它.
  3. 编译 file2.cpp 时,编译器将 x 保留原样,即不为其分配存储空间.
  4. 编译器为 y 分配存储空间,但不初始化它.
  5. 在链接file1.o和file2.o时,现在先初始化file2.o,所以现在:
    x 的初始值是否为 0?还是没有初始化?

推荐答案

C++标准3.6.2非本地对象的初始化"给出了初始化步骤:

The initialization steps are given in 3.6.2 "Initialization of non-local objects" of the C++ standard:

步骤 1:xy 在任何其他初始化发生之前进行零初始化.

Step 1: x and y are zero-initialized before any other initialization takes place.

第 2 步:xy 被动态初始化 - 标准未指定哪一个.该变量将获得值 1,因为另一个变量将被初始化为零.

Step 2: x or y is dynamically initialized - which one is unspecified by the standard. That variable will get the value 1 since the other variable will have been zero-initialized.

第三步:动态初始化另一个变量,得到值2.

Step 3: the other variable will be dynamically initialized, getting the value 2.

这篇关于静态初始化命令惨败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:静态初始化命令惨败

基础教程推荐