2013-04-28 10 views
23

Ich frage mich, über die verschiedenen Verwendungen des flüchtigen Schlüsselwort in Kombination mit Register, const und statische Schlüsselwörter. Ich bin nicht sicher, was die Auswirkungen sind, so dass ich denke:const volatile, registrieren flüchtigen, statische volatile in C++

register volatile int T=10; 

vorschlagen, die Compiler zu speichern T in einem Register und den Wert von T kann von irgendwo außerhalb (O, Hardware, ein anderer Thread)

modifiziert werden
const volatile int T=10; 

Das Programm selbst kann T nicht ändern, aber T kann außerhalb des Codes geändert werden.

static volatile int T=10; 

Wenn T ein Datenelement einer Klasse ist, bedeutet dies, dass alle Objekte der Klasse den gleichen Wert für T und T kann von irgendwo außerhalb geändert werden. Wenn T eine globale Variable in einer Datei ist, kann der Quellcode in anderen Dateien (die Teil des Projekts sind) nicht auf T zugreifen, aber auf T kann von außerhalb zugegriffen werden. Wenn T eine lokale Variable in einer Funktion ist, bleibt sie, sobald sie initialisiert wurde, bis zum Ende des Programms im Speicher und kann von irgendwo außerhalb modifiziert werden.

Sind meine Gedanken korrekt und kann jeder erfahrene C++ - Entwickler ein Beispiel geben, in dem das oben Genannte möglicherweise in realen Anwendungen verwendet wird oder es sehr selten ist?

+0

Sehr nett! +1. Könnte sogar "veränderbar" einschließen. –

Antwort

26
register volatile int T=10; 

volatile Qualifier bedeutet, dass der Compiler-Optimierungen anwenden können oder Zugriff auf T neu anordnen Während register ein Hinweis an den Compiler, die T wird stark genutzt werden. Wenn Adresse T genommen wird, wird der Hinweis einfach vom Compiler ignoriert. Beachten Sie, dass register veraltet ist, aber immer noch verwendet wird.

Praktische Anwendung:

Ich habe es nie benutzt nie die Notwendigkeit, es fühlte sich und kann von jedem Augenblick nicht wirklich denken.


const volatile int T=10; 

const Qualifier bedeutet, dass die nicht durch T Code modifiziert werden kann. Wenn Sie dies versuchen, stellt der Compiler eine Diagnose zur Verfügung. volatile bedeutet immer noch dasselbe wie in Fall 1. Der Compiler kann den Zugriff auf T nicht optimieren oder neu anordnen.

Praktische Anwendung:

  • Shared-Memory-Zugriff im schreibgeschützten Modus.
  • Zugriff auf Hardware-Register im schreibgeschützten Modus.

static volatile int T=10; 

static Speicher Qualifier gibt T statische Speicherdauer (C++ 11 §3.7) und internal linkage, während volatile noch die Optimierung und Neuordnen regelt.

Praktische Anwendung:

  • Gleiche wie volatile außer dass Sie das Objekt müssen statische Speicherdauer haben und unzugänglich von anderen Übersetzungseinheiten zu sein.
+2

Für die zweite, bist du sicher, dass du über const-volatile * objects * oder const-volatile * references * (oder Zeiger auf const-volatile objects) sprichst? Weil es nicht scheint, als ob ein const-volatiles Objekt der Hardware zugeordnet werden könnte ... – Mehrdad

+1

@Mehrdad: Ich habe mich auf Zeiger auf konstante flüchtige Objekte bezogen, so etwas wie: 'unsigned char const volatile * hd_addr;' –

+1

Ja, dein Beispiel zeigt 'const volatile int T = 10;' was anders ist. :) – Mehrdad

Verwandte Themen