Macht eine Struktur flüchtig, macht alle ihre Mitglieder flüchtig?

96

Wenn ich habe:

struct whatever {
int data;
};
volatile whatever test;
wird test.dataauch volatil sein?

Kennzeichen
quelle
4
Ausgezeichnete Frage. Ich habe gelesen, dass eine volatileMember-Funktion den thisZeiger nur flüchtig macht, sodass Mitglieder bei jedem Zugriff aus dem Speicher gelesen werden, aber nicht "offiziell" flüchtig sind.
Alexandre C.
2
Möglicherweise ein Duplikat , aber immer noch eine gute Frage.
Sergei Tachenov

Antworten:

119

Eine andere Frage kann gestellt werden (oder einfach eine andere Art, die ursprüngliche Frage zu betrachten):

Macht das Erstellen einer Struktur 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:

Warum verwenden wir in C ++ ein flüchtiges Schlüsselwort?

Nawaz
quelle
Es ist wichtig zu beachten, dass die Konstanz nur an unmittelbare Mitglieder weitergegeben wird. Wenn Ihre Struktur einen Zeiger auf ein Objekt enthält, ist der Zeiger selbst const (z. B. können Sie ihn nicht neu zuweisen), aber Sie können das Objekt ändern, auf das gezeigt wird. (Vorausgesetzt, Ihre Struktur enthält keinen Zeiger auf const)
Pablo Arias
-2

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;
Praktisch real
quelle
3
Keine Antwort auf die Frage
Jakob van Bethlehem