E.g
 foo1() {
     static const char* str = foo2();
 }
 const char * foo2 () {
     ...
 }
How does the compiler makes sure it calls foo2 just once.
foo2 is called at the initialisation of your program, just before main().
Edit: this is wrong! I assumed this as this is how normally static initialisation works. But in this case, they are called once at the start of the function.
It must work with some kind of static boolean. Yep. At least in gcc, this:
int test2()
{
    static int bla = test();
}
Compiles to:
 8048616: b8 30 a0 04 08        mov    $0x804a030,%eax
 804861b: 0f b6 00              movzbl (%eax),%eax
 804861e: 84 c0                 test   %al,%al
 8048620: 75 52                 jne    8048674 <_Z5test2v+0x67>
 ...
 804863c: e8 b3 ff ff ff        call   80485f4 <_Z4testv>
 ...
 8048674: 83 c4 1c              add    $0x1c,%esp
 8048677: 5b                    pop    %ebx
 8048678: 5e                    pop    %esi
 8048679: 5f                    pop    %edi
 804867a: 5d                    pop    %ebp
 804867b: c3                    ret    
So it uses a hidden, function specific boolean (at $0x804a030) + some magic to protect against exceptions and multiple threads calling it at once.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With