volatile (C++)

Qualificatore di tipo che è possibile utilizzare per dichiarare che un oggetto può essere modificato nel programma dall'hardware.

Sintassi

volatile declarator ;

Osservazioni:

È possibile usare l'opzione del compilatore /volatile per modificare il modo in cui il compilatore interpreta questa parola chiave.

Visual Studio interpreta la volatile parola chiave in modo diverso a seconda dell'architettura di destinazione. Per ARM, se non viene specificata alcuna opzione del compilatore /volatile , il compilatore esegue come se fosse specificato /volatile:iso . Per le architetture diverse da ARM, se non viene specificata alcuna opzione del compilatore /volatile , il compilatore esegue come se fosse specificato /volatile:ms . Per le architetture diverse da ARM, è consigliabile specificare /volatile:iso e usare primitive di sincronizzazione esplicite e intrinseche del compilatore quando si gestisce la memoria condivisa tra thread.

È possibile usare il qualificatore per fornire l'accesso volatile ai percorsi di memoria usati da processi asincroni, ad esempio i gestori di interrupt.

Quando volatile viene usato in una variabile che ha anche la parola chiave __restrict , volatile ha la precedenza.

Se un struct membro è contrassegnato come volatile, volatile viene propagato all'intera struttura. Se una struttura non ha una lunghezza che può essere copiata nell'architettura corrente usando un'istruzione, volatile potrebbe essere completamente persa in tale struttura.

La volatile parola chiave potrebbe non avere alcun effetto su un campo se una delle condizioni seguenti è vera:

  • La lunghezza del campo relativo alla parola chiave volatile supera la dimensione massima che ne consente la copia nell'architettura corrente mediante un'istruzione.

  • La lunghezza del più esterno contenente struct, o se è un membro di un probabilmente annidato struct, supera le dimensioni massime che possono essere copiate nell'architettura corrente usando un'istruzione.

Anche se il processore non riordina gli accessi alla memoria non memorizzabili nella cache, le variabili non memorizzabili nella cache devono essere contrassegnate come volatile per garantire che il compilatore non riordina gli accessi alla memoria.

Gli oggetti dichiarati come volatile non vengono usati in determinate ottimizzazioni perché i relativi valori possono cambiare in qualsiasi momento. Il sistema legge sempre il valore corrente di un oggetto di tipo volatile, se richiesto, anche se un'istruzione precedente ha richiesto un valore dallo stesso oggetto. Inoltre, il valore dell'oggetto viene scritto immediatamente nell'assegnazione.

Conforme a ISO

Se si ha familiarità con la parola chiave volatile C# o si ha familiarità con il comportamento di volatile nelle versioni precedenti del compilatore Microsoft C++ (MSVC), tenere presente che la parola chiave ISO Standard volatile C++11 è diversa ed è supportata in MSVC quando viene specificata l'opzione del compilatore /volatile:iso . Per ARM, l'opzione è specificata per impostazione predefinita. La volatile parola chiave nel codice ISO Standard C++11 deve essere usata solo per l'accesso hardware. Non usarla per la comunicazione tra thread. Per la comunicazione tra thread, usare meccanismi come std::atomic<T> dalla libreria standard C++.

Fine della conformità ISO

Sezione specifica Microsoft

Quando viene usata l'opzione del compilatore /volatile:ms, per impostazione predefinita quando le architetture diverse da ARM sono destinate, il compilatore genera codice aggiuntivo per mantenere l'ordinamento tra i riferimenti a oggetti volatili oltre a mantenere l'ordine ai riferimenti ad altri oggetti globali. In particolare:

  • La scrittura in un oggetto di tipo volatile (nota anche come scrittura di tipo volatile) presenta una semantica di rilascio, ovvero un riferimento a un oggetto globale o statico che preceda una scrittura in un oggetto volatile nella sequenza di istruzioni si verificherà prima della scrittura di tipo volatile nel file binario compilato.

  • Una lettura di un oggetto volatile (nota anche come lettura di tipo volatile) presenta una semantica di acquisizione, ovvero, un riferimento a un oggetto globale o statico che segua una lettura della memoria volatile nella sequenza di istruzioni verrà generato dopo la lettura di tipo volatile nel file binario compilato.

In questo modo gli oggetti di tipo volatile possono essere utilizzati per blocchi e rilasci di memoria in applicazioni multithreading.

Nota

Quando si basa sulla garanzia avanzata fornita quando viene usata l'opzione del compilatore /volatile:ms , il codice non è portabile.

Fine sezione specifica Microsoft

Vedi anche

Parole chiave
const
Puntatori const e volatile