Die MSDN-Dokumentation für "volatile" in Visual C ++ gibt an, dass Schreibvorgänge "release semantics" haben und Lesevorgänge "Semantik erwerben" haben, zusätzlich dazu, dass Lesevorgänge immer aus dem Speicher gelesen werden und dass Schreibvorgänge immer entsprechend geschrieben werden.
Die C-Spezifikation für "volatile" enthält den zweiten Teil (mache keine verrückten Optimierungen), aber nicht den ersten Teil (einen Speicherzaun).
Gibt es eine Möglichkeit in Visual C ++, nur das flüchtige Verhalten "C" ohne den Speicherzaun zu erhalten?
Ich möchte eine Variable zwingen, immer auf dem Stapel zu sein, an einer festen Stelle, aber ich möchte nicht den Overhead eines Speicherzauns bei jeder Zuweisung dazu nehmen.
Gibt es eine einfache Möglichkeit, das mit Visual C ++ - Quelle zu tun?
Gibt es eine Möglichkeit in Visual C ++, nur das flüchtige Verhalten "C" ohne den Speicherzaun zu erhalten?
Auf x86 gibt es keine Speicher-Zäune, die auf Assembly-Ebene bei Lese- und Schreibvorgängen auf einen volatile
-Arbeitsspeicherplatz erstellt werden, da auf dieser Plattform jede Ladung eine Semantik besitzt und jede Filiale eine Releasesemantik hat. Daher weist die Anweisung volatile
für MSVC auf x86 den Compiler einfach an, das Neuordnen von Lasten und Speichern zu verhindern, abhängig davon, ob Sie von dem Speicherort schreiben oder lesen, der mit volatile
markiert wurde.
Sie würden nur die "Strafe" eines Speicherzauns auf der IA64-Architektur eingehen, da dort das Speicherordnungsmodell der Plattform keine Semantik für das Laden und Freigeben von Speichern und Laden gewährleistet.
Beachten Sie, dass dieses Verhalten MSVC-spezifisch ist und keine standardisierte Semantik von volatile
ist.
Update : Laut @ildjarn würden Sie auch einen Speicherzaun auf ARM mit Windows 8 sehen, da diese Plattform auch ein schwach geordnetes Speicherkonsistenzmodell wie IA64 hat.
Tags und Links c++ visual-c++ volatile