2010-03-15 5 views

risposta

6

EDIT:

Questa risposta è stata inviata quando la questione era di circa la parola chiave volatile. La domanda sembra essere stata cambiata da una terza parte.

ORIGINALE:

volatile informa il compilatore che non deve presumere che il valore è appena messo nella variabile contrassegnata come volatile sarà lì la prossima volta che lo usa ... che deve verificare il valore corrente prima usandolo di nuovo.

Un esempio è se la variabile rappresenta una posizione di memoria che potrebbe essere modificata da un altro processo.

Ecco un esempio (stato secoli da quando ho fatto C++ così ti prego di perdonare eventuali problemi di sintassi minori):

volatile int x; 

int DoSomething() 
{ 
    x = 1; 

    DoSomeOtherStuff(); 

    return x+1; // Don't just return 2 because we stored a 1 in x. 
       // Check to get its current value 
} 
+1

Questo è corretto. Viene spesso utilizzato in applicazioni incorporate e in tempo reale. – penguin4hire

+1

E dice al compilatore di non eseguire alcuna ottimizzazione su di esso ... – jasonline

+4

@jasonline: dice al compilatore che non deve modificare il numero o l'ordine di letture e scritture e non deve spostare alcuna lettura o scrittura tra i punti di sequenza. Non dice esattamente "non eseguire alcuna ottimizzazione". Ad esempio, i loop che modificano i volatili possono ancora essere srotolati e il codice che accede ai volatili può essere spostato attraverso accessi non volatili. Suppongo che anche l'esecuzione speculativa sarebbe OK, a condizione che tu avessi memoria transazionale hardware e nessun indirizzo magico I/O. –

20

Per rispondere alla domanda su cosa significa avere un 'funzione membro volatili' (che può o potrebbe non essere ciò che era originariamente previsto dalla persona che ha pubblicato la domanda), contrassegnando una funzione membro come const o volatile (o un const volatile combinato) applica tali qualificatori al puntatore this utilizzato nella funzione. Come affermato dallo standard (9.2.1 "Il puntatore this"):

Il tipo di questo in una funzione membro di una class X è . Se la funzione membro viene dichiarata const, il tipo di questo è const X*, se la funzione membro viene dichiarata volatile, il tipo di this è volatile X*, e se la funzione membro viene dichiarata const volatile, il tipo di questo è const volatile X*.

Così contrassegnando la funzione membro come volatile si sarebbe essere fare qualsiasi accesso ai membri di dati non statici dell'oggetto all'interno di tale funzione membro come volatile.

+6

Quindi, in pratica, se 'obj' è' volatile Object * obj', non è possibile richiamare una funzione membro che non sia contrassegnata come 'volatile'. – bobobobo