Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

static initialization order fiasco

Tags:

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. while compiling file1.cpp, compiler leaves y as it is i.e doesn't allocate storage for it.
  2. compiler allocates storage for x, but doesn't initialize it.
  3. While compiling file2.cpp, compiler leaves x as it is i.e doesn't allocate storage for it.
  4. compiler allocates storage for y, but doesn't initialize it.
  5. While linking file1.o and file2.o, now let file2.o is initialized first, so now:
    Does x gets initial value of 0? or doesn't get initialized?
like image 995
Happy Mittal Avatar asked Jun 14 '10 06:06

Happy Mittal


People also ask

What is the order of static variable initialization across one program?

C++ guarantees that variables in a compilation unit (. cpp file) are initialised in order of declaration. For number of compilation units this rule works for each one separately (I mean static variables outside of classes). But, the order of initialization of variables, is undefined across different compilation units.

What is static initialization?

A Static Initialization Block in Java is a block that runs before the main( ) method in Java. Java does not care if this block is written after the main( ) method or before the main( ) method, it will be executed before the main method( ) regardless.

What is the order of initialization for data?

In the initializer list, the order of execution takes place according to the order of declaration of member variables. While using the initializer list for a class in C++, the order of declaration of member variables affects the output of the program. Program 1: C++

Are static variables initialized first?

Static variables are initialized only once , at the start of the execution. These variables will be initialized first, before the initialization of any instance variables. A single copy to be shared by all instances of the class. A static variable can be accessed directly by the class name and doesn't need any object.


1 Answers

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

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

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.

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

like image 107
Michael Burr Avatar answered Sep 29 '22 13:09

Michael Burr