wie @Nawaz bereits darauf hingewiesen hat:
Wenn Sie flüchtige Objekte haben, benötigen Sie volatile copy-ctor. Also läuft die Frage darauf hinaus: Wann brauchen Sie flüchtige Objekte?
Der Hauptgrund für die Verwendung eines volatilen Schlüsselworts besteht normalerweise darin, die Optimierung zu deaktivieren. Das heißt, wenn Sie so etwas haben:
%Vor%Der Compiler sieht, dass das Flag nicht geändert werden kann, so dass es nicht nötig ist, das Flag jedes Mal zu überprüfen - so wird es nicht. Aber wenn Sie Variable Variable volatil machen - es wird.
Hier ist eine Meinung über den ursprünglichen Gebrauch des volatilen Keywords: link
Kurz gesagt, es wurde ursprünglich verwendet, um über MMIO auf Hardware zuzugreifen, was etwas ungewöhnlich sein kann:
%Vor%Und Sie wollen nicht, dass diese 3 Zuweisungen aufgrund der Optimierung zu einem werden.
Und hier ist ein Artikel von Andrei Alexandrescu über volatile Multithread-Software: link
Es gab einige Zeitungen, die Alexandrescus Papier kritisierten, aber ich konnte es nicht finden. Der Punkt dort war, dass er flüchtiges Eigentum wegwarf und so weiter.
Achten Sie auf sehr wichtige Dinge beim Multithreading, auf die @JanHudec hingewiesen hat:
volatile
ist für Multithread-Kontexte völlig nutzlos, da es zwar keine Optimierung verhindert, aber keine expliziten Barrieren erzeugt. Und ohne dass das Schreiben auf einer CPU für eine andere CPU sichtbar wird (architekturabhängig; x86 hat kohärente Caches, so dass dort immer Schreibvorgänge sichtbar sind).Auch
volatile
erzwingt keine atomare Operation. Die Zuweisung von x86 ist immer atomar, aber nicht bei allen CPU-Architekturen. Und komplexere Operationen wie Inkrement können nur mitstd::atomic
atomar ausgeführt werden.
Tags und Links c++ copy-constructor