Konstruktoren/Initialisierung globaler Objekte



  • Moin.

    Ich werde aus dem Struppi nicht schlau, und aus dem Internet erst recht nicht. Codebeispiel:

    // xyz.cpp
    #include <iostream>
    #include <ostream>
    
    namespace // Damit der globale Namensbereich nicht verschmutzt wird
    {
        std::ostream& dummy = std::cout << "Hallo Welt" << std::endl;
    }
    

    Wenn ich xyz.cpp jetzt kompiliere und zu meinem Projekt hinzufüge, wird dann beim Programmstart automatisch der von dummy geforderte Code ausgeführt?

    Am liebsten wäre es mir jetzt, er würde garantiert vor Programmstart ausgeführt werden - dass die Reihenfolge mehrerer solcher Initialisierungen undefiniert ist, habe ich schon verstanden, aber das wäre in meinem Fall völlig egal.

    Allerdings habe ich auf mehreren Seiten irgendwelchen Kauderwelsch gelesen, der besagte, dass "global constructors may be executed before the call to main()" - aber was wäre die Alternative? Dass der Linker die Datei komplett wegwirft? Dass die Variable erst bei der ersten Benutzung initialisiert wird?



  • Ich würde sagen, der Code wird vor dem "call to main()" ausgeführt, falls sich die globale Variable im Programm selbst oder in einer DLL befindet, die beim Start automatisch geladen wird. Er wird erst nach dem Aufruf von main() ausgeführt, falls sich die Variable in einer DLL befindet, die das Programm "von Hand" läd, unter Windows also beispielsweise mit LoadLibrary().

    Ich meine aber, daß der Code, zumindest im ersten Fall, unsicher ist, da nicht definiert ist, ob std::cout zum Zeitpunkt des Aufrufs überhaupt initialisiert ist. Das ist ja auch eine globale Variable!

    Stefan.



  • Wenn die Initialisierungsreihenfolge von globalen Variablen wichtig ist, dann kannst du das am besten mit Singletons kontrollieren.



  • Hallo,
    meines Wissens nach gibt es Compiler/Linker die den Code nur Ausführen, wenn die zu initialisierende Variable (hier dummy) später auch benutzt wird. Das ist soweit ich weiß auch konform (as-if-rule -> es wird ja nur garantiert, dass du dummy in jeder *nicht inline* Funktion verwendet werden kann, da es dann auf jeden Fall initialisiert ist). Häufig gibt es dann aber entsprechende force-switches für den Compiler/Linker .

    aber was wäre die Alternative? Dass der Linker die Datei komplett wegwirft? Dass die Variable erst bei der ersten Benutzung initialisiert wird?

    s.o.

    In comp.lang.c++.moderated solltest du viele Antworten finden. Besonders im Zusammenhang mit Factories wird dieses Thema häufig diskutiert.



  • kingruedi schrieb:

    Wenn die Initialisierungsreihenfolge von globalen Variablen wichtig ist, dann kannst du das am besten mit Singletons kontrollieren.

    Ich hab doch extra geschrieben, dass die egal ist 🙄

    HumeSikkins schrieb:

    meines Wissens nach gibt es Compiler/Linker die den Code nur Ausführen, wenn die zu initialisierende Variable (hier dummy) später auch benutzt wird.

    Probieren geht über Studieren - ich hab nach dem Post rausgefunden, dass sogar der VC7.1 Standard sich mit der Initialisierung Zeit lässt. Der Code liegt in meinem Fall in einer .lib, was die Situation scheinbar nochmal schlimmer macht. Doofe Sprachregel 😞


Anmelden zum Antworten