Sind Dateibereichs-Atomics dem Initialisierungsreihenfolge-Fiasko unterworfen?

10

Betrachten Sie Folgendes, wobei wir zwei Objekte mit Dateiumfang in verschiedenen Übersetzungseinheiten haben. Dies ist die übliche Einstellung für undefiniertes Verhalten über das Initialisierungsreihenfolge-Fiasko:

a.hpp :

%Vor%

a.cpp :

%Vor%

b.cpp :

%Vor%

Wird dieser Code einem Initialisierungsreihenfolge-Fiasko zwischen dem Dateibereich "atomic things " in a.cpp und dem Dateibereich static_thing in b.cpp unterzogen? Wenn nicht, warum nicht? Was ist das Besondere an std :: atomic, das entfernt, was sonst ein klares init-Order-Fiasko wäre? Gibt es ein bestimmtes Konzept, das benannt werden kann, um dies mit einer statischen Behauptung durchzusetzen? Etwas wie:

%Vor%

Wenn nicht std::is_trivial , gibt es ein anderes Konzept und eine damit verbundene Typeigenschaft, die das besser modelliert?

Gibt es umgekehrt ein Deinitialisierungsfiasko? Die gleichen Fragen, wenn ja, warum oder warum nicht.

    
acm 12.06.2016, 13:03
quelle

2 Antworten

3

std::atomic<> ist ein Standardlayouttyp mit trivialen Standardkonstruktoren und trivialen Destruktoren. Daher wird es in der Phase static initialization vor der Phase dynamic initialization initialisiert, wenn Konstruktoren globaler Objekte aufgerufen werden.

Mit anderen Worten, hier passiert kein Fiasko der Initialisierungsreihenfolge.

Da Sie den Namespace-Bereich std::atomic<int> nicht explizit initialisieren, wird er initialisiert.

  

§ 3.6.2 Initialisierung von nicht lokalen Variablen

     

Variablen mit statischer Speicherdauer (3.7.1) oder Thread-Speicherdauer (3.7.2) müssen vor jeder weiteren Initialisierung auf Null initialisiert (8.5) werden.

     

Die Nullinitialisierung und die konstante Initialisierung werden zusammen als statische Initialisierung bezeichnet. Alle anderen Initialisierungen sind dynamische Initialisierungen. Die statische Initialisierung muss durchgeführt werden, bevor eine dynamische Initialisierung stattfindet.

    
Maxim Egorushkin 13.06.2016 16:20
quelle
1

Mein Verständnis von C ++ "Initialisierungsreihenfolge Fiasko" ist, dass es nur gilt, wenn Konstruktoren zur Laufzeit aufgerufen werden müssen. Wenn der Code in die Initialisierung eines Speicherplatzes auf einen festen Wert übergehen kann, wird dieser Wert wie jeder andere vorinitialisierte POD (Plain Ol 'Data) in den Linker-Abschnitt "initialized data" ( .data ) gestellt. und es gibt kein Fiasko.

Ich würde vorschlagen, dass ein atomic genau dieses Kriterium erfüllt.

    
John Burger 13.06.2016 13:48
quelle