Betrachten Sie die folgende Sequenz von Schreibvorgängen zu volatile
Speicher, die ich von David Chisnall's article at InformIT genommen habe, „C11 Verständnis und C 11 ++ Atomics“:Müssen Zugriffe auf flüchtige Stoffe neu geordnet werden?
volatile int a = 1;
volatile int b = 2;
a = 3;
Mein Verständnis von C++ 98 war, dass diese Operationen konnte nicht mehr nachbestellt werden pro C++ 98 1.9:
konforme Implementierungen erforderlich sind (nur) das beobachtbare Verhalten der abstrakten Maschine zu emulieren wie unten ... das beobachtbare Verhalten der erklärt abstrakte Maschine ist die Folge von liest und schreibt auf flüchtige Daten und Anrufe Bibliothek I/O-Funktionen
Chisnall sagt, dass die Beschränkung auf, um die Bewahrung nur auf einzelne Variablen gilt, Schreiben, dass eine konforme Implementierung Code erzeugen könnte, die dies bedeutet:
a = 1;
a = 3;
b = 2;
Oder diese:
b = 2;
a = 1;
a = 3;
C++ 11 wiederholt die C++ 98 Formulierung, dass
konforme Implementierungen sind erforderlich, um (nur) das beobachtbare Verhalten der abstrakten Maschine zu emulieren, wie unten unter erläutert.
aber sagt über volatile
s (1,9/8):
Zugriff auf flüchtige Objekte sind streng nach den Regeln der abstrakten Maschine ausgewertet.
1,9/12 sagt, dass ein volatile
glvalue Zugriff ist eine Nebenwirkung, und 1,9/14, so dass die Nebenwirkungen in einem vollen Ausdruck (der die Variablen a
, b
und c
oben enthält) (zB ein Anweisung) muss den Nebenwirkungen eines späteren vollständigen Ausdrucks im selben Thread vorausgehen. Dies führt mich zu dem Schluss, dass die zwei Umordnungen, die Chisnall zeigt, ungültig sind, weil sie nicht der Reihenfolge entsprechen, die von der abstrakten Maschine diktiert wird.
Bin ich etwas übersehen, oder ist Chisnall falsch?
(Beachten Sie, dass dies kein Einfädeln Frage. Die Frage, ob ein Compiler in einem einzigen Thread Zugriffe auf unterschiedliche volatile
Variablen neu zu ordnen. Erlaubt)
mögliche Duplikate von ["volatile" Qualifier und Compiler-Umordnungen] (http://stackoverflow.com/questions/2535148/volatile-qualifier-and-compiler-reorderings) –