volatile (C++)

Ein Typqualifizierer, den Sie verwenden können, um zu deklarieren, dass ein Objekt im Programm von der Hardware geändert werden kann.

Syntax

volatile declarator ;

Hinweise

Sie können den Switch "/volatile compiler" verwenden, um zu ändern, wie der Compiler diese Schlüsselwort (keyword) interpretiert.

Visual Studio interpretiert die volatile Schlüsselwort (keyword) je nach Zielarchitektur unterschiedlich. Wenn für ARM keine /volatile Compileroption angegeben ist, führt der Compiler so aus, als ob /volatile:iso angegeben wurde. Wenn keine /volatile Compileroption angegeben ist, wird der Compiler bei anderen Architekturen als ARM ausgeführt. Daher wird dringend empfohlen, dass Sie /volatile:iso angeben und explizite Synchronisierungsgrundtypen und compilerinterne Synchronisierungsgrundtypen und Compiler verwenden, wenn Sie über Threads gemeinsam genutzten Arbeitsspeicher verfügen.

Sie können den volatile Qualifizierer verwenden, um Zugriff auf Speicherspeicherorte bereitzustellen, die von asynchronen Prozessen wie Interrupthandlern verwendet werden.

Wenn volatile sie für eine Variable verwendet wird, die auch über die __restrict Schlüsselwort (keyword) verfügt, volatile hat Vorrang.

Wenn ein struct Element als volatilegekennzeichnet ist, wird es volatile an die gesamte Struktur weitergegeben. Wenn eine Struktur nicht über eine Länge verfügt, die mithilfe einer Anweisung auf die aktuelle Architektur kopiert werden kann, volatile kann diese Struktur vollständig verloren gehen.

Die volatile Schlüsselwort (keyword) wirkt sich möglicherweise nicht auf ein Feld aus, wenn eine der folgenden Bedingungen zutrifft:

  • Die Länge des flüchtigen Felds überschreitet die maximale Größe, die in der aktuellen Architektur mithilfe einer Anweisung kopiert werden kann.

  • Die Länge des äußersten Rands, structder ein Element eines möglicherweise geschachtelten structElements ist, überschreitet die maximale Größe, die mithilfe einer Anweisung auf die aktuelle Architektur kopiert werden kann.

Obwohl der Prozessor keinen nicht zwischengespeicherten Speicherzugriff neu anordnet, müssen nicht zwischengespeicherte Variablen so gekennzeichnet volatile werden, dass sichergestellt wird, dass der Compiler den Speicherzugriff nicht neu anordnet.

Objekte, die als volatile nicht in bestimmten Optimierungen verwendet werden, da sich ihre Werte jederzeit ändern können. Das System liest bei jeder Anforderung den aktuellen Wert eines flüchtigen Objekts, selbst wenn eine vorherige Anweisung bereits den Wert des gleichen Objekts abgefragt hatte. Außerdem wird der Wert des Objekts sofort durch Zuweisung geschrieben.

ISO-konform

Wenn Sie mit dem volatilen Schlüsselwort (keyword) C# vertraut sind oder mit dem Verhalten volatile früherer Versionen des Microsoft C++-Compilers (MSVC) vertraut sind, beachten Sie, dass die C++11 ISO Standard-Schlüsselwort (keyword) volatile anders ist und in MSVC unterstützt wird, wenn die Option "/volatile:iso compiler" angegeben wird. (In ARM ist es standardmäßig festgelegt). Der volatile Schlüsselwort (keyword) im C++11 ISO-Standardcode ist nur für den Hardwarezugriff zu verwenden. Verwenden Sie sie nicht für die Interthreadkommunikation. Verwenden Sie für die Interthreadkommunikation Mechanismen wie std::atomic<T> aus der C++-Standardbibliothek.

Ende der ISO-Konformen

Microsoft-spezifisch

Wenn die Compileroption "/volatile:ms" verwendet wird – standardmäßig, wenn andere Architekturen als ARM ausgerichtet sind – generiert der Compiler zusätzlichen Code, um die Sortierung zwischen Verweisen auf veränderliche Objekte zusätzlich zu Standard die Sortierung von Verweisen auf andere globale Objekte zu Standard Standard. Dies gilt insbesondere für:

  • Das Schreiben in ein flüchtiges Objekt (auch als flüchtiger Schreibvorgang bezeichnet) weist Release-Semantik auf. Das heißt, dass ein Verweis auf ein globales oder statisches Objekt, das vor einem Schreibvorgang in ein flüchtiges Objekt in der Anweisungsabfolge auftritt, vor diesem flüchtigen Schreibvorgang in der kompilierten Binärdatei auftritt.

  • Das Lesen eines flüchtigen Objekts (auch als flüchtiger Lesevorgang bezeichnet) weist Acquire-Semantik auf. Das heißt, dass ein Verweis auf ein globales oder statisches Objekt, das nach dem Lesevorgang eines flüchtigen Arbeitsspeichers in der Anweisungsabfolge auftritt, nach dem flüchtigen Lesevorgang in der kompilierten Binärdatei auftritt.

Dadurch können flüchtige Objekte für Arbeitsspeichersperren und -freigaben in Multithreadanwendungen verwendet werden.

Hinweis

Wenn sie auf die erweiterte Garantie basiert, die beim Verwenden der Compileroption "/volatile:ms " bereitgestellt wird, ist der Code nicht portierbar.

Ende Microsoft-spezifisch

Siehe auch

Schlüsselwörter
const
const- und volatile-Zeiger