La creazione di una struttura volatile rende volatili tutti i suoi membri?


96

Se ho:

struct whatever {
int data;
};
volatile whatever test;
sarà test.dataanche volatile?


4
Ottima domanda. Ho letto che avere una volatilefunzione membro rende solo il thispuntatore volatile, quindi i membri verranno letti dalla memoria ogni volta che vi si accede ma non sono "ufficialmente" volatili.
Alexandre C.

2
Forse un duplicato , ma comunque una buona domanda.
Sergei Tachenov

Risposte:


119

Un'altra domanda può essere posta (o semplicemente un altro modo di guardare la domanda originale):

La creazione di una struttura constrende tutti i suoi membri const?

Se ho:

struct whatever { int data; };

const whatever test;

Lo sarà constanche test.data ?

La mia risposta è: sì. Se dichiari un oggetto di tipo whatevercon, constlo saranno constanche tutti i suoi membri

Allo stesso modo, se dichiari un oggetto di tipo whatevercon, volatilelo saranno volatileanche tutti i suoi membri , proprio come se dichiari l'oggetto con const, lo saranno constanche tutti i suoi membri .

conste volatilesono due facce della stessa moneta; sono così che lo Standard spesso li chiama cv-qualifiers.


Citando dallo Standard ($ 7.1.5.1 / 8)

[Nota: volatile è un suggerimento all'implementazione per evitare un'ottimizzazione aggressiva che coinvolge l'oggetto perché il valore dell'oggetto potrebbe essere modificato in modo non rilevabile da un'implementazione. Vedere 1.9 per la semantica dettagliata. In generale, la semantica di volatile deve essere la stessa in C + + come in C.]

Ciò significa che se il tuo oggetto è un'istanza di una struttura, il compilatore non può evitare un'ottimizzazione aggressiva che coinvolge l'oggetto , a meno che non eviti un'ottimizzazione aggressiva di ciascuno dei suoi membri. (Altrimenti, in quale altro modo può evitare l'ottimizzazione che coinvolge l'oggetto?)


Argomento correlato:

Perché usiamo la parola chiave volatile in C ++?


È importante notare che la costanza viene propagata solo ai membri immediati. Se la tua struttura contiene un puntatore a qualche oggetto, il puntatore stesso sarà const (es. Non sarai in grado di riassegnarlo), ma sarai in grado di cambiare l'oggetto a cui punta. (supponendo che la tua struttura non stia codificando un puntatore a const)
Pablo Arias

-2

Da: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx

Per dichiarare l'oggetto a cui punta il puntatore come const o volatile, utilizzare una dichiarazione del modulo:

const char *cpch;
volatile char *vpch;

Per dichiarare il valore del puntatore, ovvero l'indirizzo effettivo memorizzato nel puntatore, come const o volatile, utilizzare una dichiarazione del modulo:

char * const pchc;
char * volatile pchv;

3
Non una risposta alla domanda
Jakob van Bethlehem
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.