2010-12-14 7 views
237

Eventuali duplicati:
C++: When Has The volatile Keyword Ever Helped You?Perché usiamo la parola chiave volatile in C++?

ho mai usato, ma mi chiedo perché la gente lo usa? Cosa fa esattamente? Ho cercato nel forum, ho trovato solo C# o argomenti Java.

+0

Uguale a [C++: Quando ha la volatilità La parola chiave ti ha mai aiutato? ] (http://stackoverflow.com/questions/72552/c-when-has-the-volatile-keyword-ever-helped-you). –

+10

Anche se si tratta di un duplicato, penso che la risposta di Nawaz sia molto più completa e comprensibile della domanda duplicata. – ross

risposta

798

Considerate questo codice,

int some_int = 100; 

while(some_int == 100) 
{ 
    //your code 
} 

Quando questo programma viene compilato, il compilatore può ottimizzare questo codice, se constata che il programma mai mai rende qualsiasi tentativo di modificare il valore di some_int, in modo da potrebbe essere tentato di ottimizzare il ciclo while cambiandolo da while(some_int == 100) a semplicemente while(true) in modo che l'esecuzione possa essere veloce (poiché la condizione nel ciclo while sembra essere true sempre). (se il compilatore non ottimizzare esso, allora deve recuperare il valore di some_int (se non è caricato in un registro) e confrontarlo con 100, ogni volta che è ovviamente un po 'lento.)

Tuttavia, l'ottimizzazione (di alcune parti del programma) potrebbe essere indesiderabile, perché potrebbe essere che qualcun altro stia modificando il valore di some_int da all'esterno del programma di cui il compilatore non è a conoscenza di, poiché può ' lo vedo; ma è come l'hai progettato. In tal caso, l'ottimizzazione del compilatore sarebbe non produrre il risultato desiderato!

Quindi, per garantire il risultato desiderato, è necessario in qualche modo impedire al compilatore di ottimizzare il ciclo while. È qui che la parola chiave volatile svolge il suo ruolo.Tutto quello che devi fare è questo,

volatile int some_int = 100; //note the 'volatile' qualifier now! 

In altre parole vorrei spiegare questo come segue:

volatile dice al compilatore che,

"Hey compilatore, io' m volatile e, tu sai, posso essere cambiato da qualche XYZ di cui non sei nemmeno a conoscenza. Quello XYZ potrebbe essere qualsiasi cosa. Forse qualche alieno al di fuori di questo pianeta chiamato il programma . Forse qualche illuminazione, qualche forma di interruzione, vulcani, ecc., , , può mutarmi. Può essere. Non sai mai chi sarà il a cambiarmi! Quindi tu O ignorante, smetti di suonare un dio onnisciente , e non osare toccare il codice dove sono presente. Va bene?"

Bene, questo è il modo volatile impedisce compilatore di ottimizzazione del codice. Ora google per vedere alcuni esempi di esempio.


Citando dal ++ standard C ($ 7.1.5.1/8)

[..] volatile è un suggerimento per il attuazione evitano aggressivo ottimizzazione coinvolge l'oggetto perché il valore dell'oggetto potrebbe essere cambiata per mezzo non rilevabili da un implementazione [...]

Argomento correlato:.

Does making a struct volatile make all its members volatile?

+46

È importante aggiungere che 'volatile' è un qualificatore, simile a' const' (ma ovviamente con un significato diverso) in modo da poter dichiarare anche i metodi 'volatile' che possono essere chiamati solo su istanze' volatile'. – ereOn

+0

@ fingerprint211b: grazie :-) (è deludente che le persone non incoraggino il buon lavoro, al contrario lo scoraggiano, anche questo non è un problema se mi dicono il motivo per cui lo fanno, almeno in quel modo può migliorare me stesso.) – Nawaz

+0

Ho pensato che questo è ciò che la parola chiave 'extern' è per? – Maxpm

8

Nella programmazione per computer, in particolare nei linguaggi di programmazione C, C++ e C#, una variabile o oggetto dichiarato con la parola chiave volatile di solito ha proprietà speciali correlate all'ottimizzazione e/o al threading. In generale, la parola chiave volatile ha lo scopo di impedire al compilatore (pseudo) di applicare eventuali ottimizzazioni sul codice che presuppongono che i valori delle variabili non possano cambiare "da soli". (C) Wikipedia

http://en.wikipedia.org/wiki/Volatile_variable

+27

volatile non ha nulla a che fare con i thread –

+20

La parola chiave volatile è un qualificatore di tipo utilizzato per dichiarare che un oggetto può essere modificato nel programma da qualcosa come il sistema operativo, l'hardware o un thread di esecuzione simultanea. (c) Riferimento MSDN C++. (http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx) Ma certamente msdn e wikipedia sono sbagliati, e tu hai ragione. – Ivan

+3

'volatile' non è d'aiuto con il threading. Le letture/scritture volatili possono ancora essere riordinate rispetto a quelle non volatili, il che rende inutile il threading. Inoltre, potresti aver notato il grosso grasso "Microsoft Specific" sulla pagina MSDN. L'implementazione di volatile da parte di Microsoft offre ulteriori garanzie oltre a quelle specificate dallo standard. Quindi sì, tecnicamente parlando, MSDN è sbagliato. E dovrebbe essere una piccola sorpresa che Wikipedia possa essere sbagliato. – jalf

-5

La parola chiave volatile è una qualificazione tipo usato per dichiarare che un oggetto può essere modificato nel programma da qualcosa come il sistema operativo, l'hardware, o un thread contemporaneamente esecuzione.

dichiarante volatile;

+13

Le risposte di copia-incolla sono di solito fatte citando parti rilevanti della fonte originale, mentre si collegano ad essa. Non farlo è un terribile caso di plagio che detesto.Anche se hai scritto l'articolo originale, non collegarlo ad esso è un auto-plagio (che è probabilmente meno detestabile). –