Se ho:
struct whatever {
int data;
};
volatile whatever test;
sarà test.dataanche volatile?
Se ho:
struct whatever {
int data;
};
volatile whatever test;
sarà test.dataanche volatile?
Risposte:
Un'altra domanda può essere posta (o semplicemente un altro modo di guardare la domanda originale):
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:
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;
volatilefunzione membro rende solo ilthispuntatore volatile, quindi i membri verranno letti dalla memoria ogni volta che vi si accede ma non sono "ufficialmente" volatili.