volatile (C++)
Un qualificatore di tipo che è possibile utilizzare per dichiarare che un oggetto può essere modificato nel programma dall'hardware.
volatile declarator ;
Note
È possibile utilizzare l'opzione del compilatore /volatile per modificare il modo in cui il compilatore interpreta questa parola chiave.
Visual Studio interpreta la parola chiave volatile in modo diverso a seconda dell'architettura di destinazione. Per ARM, se nessuna opzione del compilatore /volatile è specificata, il compilatore si comporta come se /volatile:iso fosse specificata. Per le architetture diverse da ARM, se nessuna opzione /volatile del compilatore è specificata, il compilatore si comporta come se /volatile:ms fosse specificata; pertanto, su architetture diverse da ARM si consiglia vivamente di specificare /volatile:iso e di utilizzare primitive esplicite di sincronizzazione e intrinseche al compilatore quando si ha a che fare con memoria condivisa fra thread.
È possibile utilizzare il qualificatore volatile per fornire l'accesso alle locazioni di memoria utilizzate dai processi asincroni come i gestori di interrupt.
Quando volatile viene utilizzata su una variabile che ha la parola chiave __restrict, volatile ha la precedenza.
Se un membro struct è contrassegnato come volatile, volatile viene propagato all'intera struttura. Se una struttura non ha una lunghezza che possa essere copiata sull'architettura corrente con una istruzione, volatile può essere completamente persa su tale struttura.
La parola chiave volatile potrebbe non avere effetto su un campo se una delle seguenti condizioni si verificasse:
La lunghezza del campo volatile supera la dimensione massima che può essere copiata nell'architettura corrente mediante un'istruzione.
La lunghezza della struct più esterna—oppure se è un membro di una struct eventualmente annidata— supera la dimensione massima che può essere copiata nell'architettura corrente mediante una istruzione.
Sebbene il processore non riordini gli accessi alla memoria un-cacheable, le variabili un-cacheable devono essere contrassegnate come volatile per garantire che il compilatore non riordini gli accessi alla memoria.
Oggetti che vengono dichiarati come volatile non sono utilizzati in determinate ottimizzazioni perché i valori possono cambiare in qualsiasi momento. Il sistema legge sempre il valore corrente di un oggetto volatile se richiesto, anche se un'istruzione precedente ha richiesto un valore dallo stesso oggetto. Inoltre, il valore dell'oggetto viene scritto immediatamente nell'assegnamento.
Conformità ISO
Se si ha dimestichezza con la parola chiave Volatile c#, o familiarità con il comportamento volatile nelle versioni precedenti di Visual C++, tenere presente che la parola chiave volatile dello standard ISO di C++11 è diversa ed è supportata in Visual Studio quando l'opzione del compilatore /volatile:iso è specificata. (Per ARM, specificata per impostazione predefinita). La parola chiave volatile nel codice dello standard ISO di C++11 deve essere utilizzata solo per accessi hardware; da non utilizzare per la comunicazione fra thread. Per la comunicazione fra thread, fare uso di meccanismi come std::atomic<T> da Libreria di modelli standard di C++.
Specifici di Microsoft
Quando l'opzione del compilatore /volatile:ms viene usata—per impostazione predefinita quando l'architettura target è diversa da ARM— il compilatore genera codice aggiuntivo per mantenere l'ordine tra i riferimenti agli oggetti volatili oltre a gestire l'ordine a riferimenti ad altri oggetti globali. In particolare:
La scrittura verso un oggetto volatile (anche noto come volatile write) presenta semantica Release; ovvero, un riferimento a un oggetto globale o statico che si verifica prima di una scrittura verso un oggetto volatile nella sequenza di istruzione si verificherà prima della volatile write nel binario compilato.
Una lettura di un oggetto volatile (anche noto come volatile read) dispone di semantica Acquire; ovvero, un riferimento a un oggetto globale o statico che si verifica dopo la lettura della memoria volatile nella sequenza d'istruzione verrà generato dopo la volatile read nel binario compilato.
In questo modo gli oggetti volatili possono essere utilizzati per lock e release della memoria in applicazioni multithreading.
Nota
Quando si basa sulla garanzia avanzata che è resa disponibile quando è usata l'opzione /volatile:ms del compilatore, il codice potrebbe non essere portabile.