2013-10-09 6 views
8

Könnten Sie ein triviales oder reales Beispiel geben, um die Verwendung von volatilen Kopierkonstruktoren zu demonstrieren?Für was ist ein flüchtiger Kopierkonstruktor?

Ich konnte einfach nicht mit einem kommen.

+6

Wenn Sie flüchtige Objekte haben, benötigen Sie volatile Kopie-Ctor. Die Frage lautet also: Wann brauchen Sie flüchtige Objekte? – Nawaz

Antwort

8

als @Nawaz bereits darauf hingewiesen:

Wenn Sie flüchtige Objekte haben, müssen Sie flüchtige Kopie-Ctor. Die Frage lautet also: Wann brauchen Sie flüchtige Objekte?

Hauptgrund für die Verwendung von flüchtigen Schlüsselwort ist in der Regel die Optimierung zu deaktivieren. Das ist, wenn Sie so etwas wie diese:

bool flag = false; 
if(!flag) {} 

Compiler wird diese Flagge sieht nicht geändert werden kann, so gibt es keine Notwendigkeit Flagge jedes Mal zu überprüfen - so wird es nicht. Aber wenn Sie Variable Variable volatil machen - wird es.

hier eine Meinung Schlüsselwort volatile ursprüngliche Nutzung ist: link

Kurz gesagt, es wurde ursprünglich für den Zugriff auf Hardware über MMIO verwendet, die etwas ungewöhnlich sein mag:

unsigned char* pControl = 0xff24 ; 
*pControl = 0 ; 
*pControl = 0 ; 
*pControl = 0 ; 

Und Sie tun nicht möchte, dass diese 3 Aufgaben aufgrund der Optimierung zu einem werden.

Und hier ist ein Papier von Andrei Alexandrescu auf volatile in multithreaded Software: link

Es gibt einige Papiere waren Alexandrescu Papier kritisieren, aber ich konnte sie nicht finden. Der Punkt dort war, dass er flüchtiges Eigentum wegwarf und so weiter.

von sehr wichtigen Sache auf Multithreading bewusst sein, wies von @JanHudec aus:

volatile ist völlig nutzlos für kontext multi-threaded, denn während es Optimierung verhindert, spielt es keine expliziten Barrieren zu erzeugen. Und ohne dass das Schreiben auf einer CPU für eine andere CPU sichtbar wird (architekturabhängig; x86 hat kohärente Caches, so dass Schreibvorgänge dort immer sichtbar sind).

Auch volatile zwingt den Vorgang nicht zu atomaren. Die Zuweisung von x86 ist immer atomar, aber nicht bei allen CPU-Architekturen. Und komplexere Operationen wie Inkrement können nur mit std::atomic atomar ausgeführt werden.

+0

Die Meinung ist nicht verfügbar, versuchen Sie es mit einem gültigen Permalink. – Zeta

+0

@ Zeta - danke. Die URL wurde irgendwie durcheinander gebracht; bearbeitet. –

+3

'volatile' ist für Multi-Threaded-Kontext 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 Schreibvorgänge dort immer sichtbar sind). –