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?)
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)
Verwenden Sie eine Deklaration des Formulars, um das Objekt, auf das der Zeiger zeigt, als const oder flüchtig zu deklarieren:
constchar*cpch;volatilechar*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:
volatile
Member-Funktion denthis
Zeiger nur flüchtig macht, sodass Mitglieder bei jedem Zugriff aus dem Speicher gelesen werden, aber nicht "offiziell" flüchtig sind.Antworten:
Eine andere Frage kann gestellt werden (oder einfach eine andere Art, die ursprüngliche Frage zu betrachten):
Macht das Erstellen einer Struktur
const
alle ihre Mitgliederconst
?Wenn ich habe:
Wird test.data auch sein
const
?Meine Antwort lautet: Ja. Wenn Sie ein Objekt vom Typ deklarieren
whatever
mitconst
dann alle ihre Mitglieder werdenconst
zuWenn Sie ein Objekt vom Typ
whatever
mit deklarieren, sind auchvolatile
alle seine Mitglieder vorhandenvolatile
, genau wie wenn Sie das Objekt mit deklarierenconst
, sind auch alle seine Mitgliederconst
.const
undvolatile
sind zwei Gesichter derselben Münze; Sie sind so, dass der Standard sie oft als bezeichnetcv-qualifiers
.Zitat aus dem Standard ($ 7.1.5.1 / 8)
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?
quelle
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:
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:
quelle