jeremy  barrett <[EMAIL PROTECTED]> writes:

> int* A::x = new int(5);

Note that 'A::x' is initialized to a non-constant value. That means
'gcc' has to initialize it dynamically. In effect, 'gcc' writes a
new function (called static_initialization_and_destruction()),
which is called via exactly the same mechanism as your initAx().

The order of static_init...() and initAx() is not specified,
gcc-3.3.3 for Linux/x86 calls initAx() after static_init...(),
while gcc-4.3.0 calls them in reverse order.

> int B::x = 5;

Here 'B::x' is initialized to a compile-time constant, so 'gcc'
doesn't have to produce any runtime code, it simply puts the variable
into initialized data (.data) section.

> What's happening is:
> -init* functions are called first
> --before setX() calls:
> ---B::x == 5
> ---A::x == NULL (?)
                                    <-------------------------+
> --after setX() calls:                                       |
> ---B::x == 4                                                |
> ---A::*x == 4                                               |
> -***magic***                                                |
                                                              |
   with gcc-4.x static_initialization... is called here,      |
   but with gcc-3.3.3 it would have been called there --------+

> -main() is called
> --B::x == 4
> --A::*x == 5 (dammit!)
...
> If anyone knows the order of operations of static member
> initialization (different for pointers, apparently), the .init section
> and whatever else happens before main() in an ELF binary, I probably
> want to hear from you.

It should be enlightening for you to compile the following separate
snippets into assembly and understand the result:

int x = 5;     // compile-time constant

int x;
int *px = &x;  // link-time constant


int foo();
int x = foo(); // runtime intialization required


Finally, it is entirely pointless to provide initAx() and initBx().
If you want to initialize A::x and B::x to some values, just do
so directly:

int *A::x = new int(4);
int B::x = 4;

Cheers,
-- 
In order to understand recursion you must first understand recursion.
Remove /-nsp/ for email.
_______________________________________________
help-gplusplus mailing list
help-gplusplus@gnu.org
http://lists.gnu.org/mailman/listinfo/help-gplusplus

Reply via email to