Wenn ich habe:
struct whatever {
int data;
};
volatile whatever test;
wird test.dataauch volatil sein?
Wenn ich habe:
struct whatever {
int data;
};
volatile whatever test;
wird test.dataauch volatil sein?
Antworten:
Eine andere Frage kann gestellt werden (oder einfach eine andere Art, die ursprüngliche Frage zu betrachten):
constalle ihre Mitglieder const?Wenn ich habe:
struct whatever { int data; };
const whatever test;
Wird test.data auch sein const?
Meine Antwort lautet: Ja. Wenn Sie ein Objekt vom Typ deklarieren whatevermit constdann alle ihre Mitglieder werden constzu
Wenn Sie ein Objekt vom Typ whatevermit deklarieren, sind auch volatilealle seine Mitglieder vorhanden volatile, genau wie wenn Sie das Objekt mit deklarieren const, sind auch alle seine Mitglieder const.
constund volatilesind zwei Gesichter derselben Münze; Sie sind so, dass der Standard sie oft als bezeichnet cv-qualifiers.
Zitat aus dem Standard ($ 7.1.5.1 / 8)
[Hinweis: Volatile ist ein Hinweis auf die Implementierung , um eine aggressive Optimierung des Objekts zu vermeiden , da der Wert des Objekts durch Mittel geändert werden kann, die von einer Implementierung nicht erkannt werden können. Siehe 1.9 für eine detaillierte Semantik. Im Allgemeinen soll die Semantik von flüchtigen Bestandteilen in C ++ dieselbe sein wie in C.]
Das heißt, wenn Ihr Objekt eine Instanz einer Struktur ist, kann der Compiler eine aggressive Optimierung des Objekts nicht vermeiden , es sei denn, er vermeidet eine aggressive Optimierung jedes seiner Mitglieder. (Wie kann sonst eine Optimierung des Objekts vermieden werden?)
Verwandte Themen:
Von: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx
Verwenden Sie eine Deklaration des Formulars, um das Objekt, auf das der Zeiger zeigt, als const oder flüchtig zu deklarieren:
const char *cpch;
volatile char *vpch;
Verwenden Sie eine Deklaration der folgenden Form, um den Wert des Zeigers - dh die im Zeiger gespeicherte tatsächliche Adresse - als const oder volatile zu deklarieren:
char * const pchc;
char * volatile pchv;
volatileMember-Funktion denthisZeiger nur flüchtig macht, sodass Mitglieder bei jedem Zugriff aus dem Speicher gelesen werden, aber nicht "offiziell" flüchtig sind.