Condividi tramite


volatile (C++)

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

volatile declarator ;

Note

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

Visual Studio interpreta la parola chiave di volatile in modo diverso a seconda dell'architettura di destinazione.Per il monitoraggio ARM, se nessuna opzione del compilatore di /volatile è specificata, il compilatore esegue /volatile:iso come se fosse specificata.Per le architetture diverso dal monitoraggio ARM, se nessuna opzione del compilatore di /volatile è specificata, il compilatore esegue come se /volatile:ms sia stato specificato; pertanto, per le architetture diverso dal monitoraggio ARM che è consigliabile specificare /volatile:isoe che si utilizza le primitive di sincronizzazione e gli intrinseci esplicite del compilatore quando si utilizzano la memoria che è condiviso tra thread.

È possibile utilizzare il qualificatore di volatile per fornire l'accesso a percorsi di memoria utilizzate dai processi asincroni come gestore di interrupt.

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

Se un membro di struct è contrassegnato come volatile, quindi volatile viene propagato alla struttura intera.Se una struttura non ha una lunghezza che possa essere copiata sull'architettura corrente utilizzando un'istruzione, volatile può essere completamente perso su tale struttura.

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

  • La lunghezza del campo volatile supera la dimensione massima che può essere copiatoarchitettura corrente mediante un'istruzione.

  • La lunghezza di structcontenitore più esterno oppure se è un membro di structeventualmente annidati — supera la dimensione massima che può essere copiatoarchitettura corrente mediante un'istruzione.

Sebbene il processore non riordinare gli accessi alla memoria non memorizzabili, le variabili non memorizzabili devono essere contrassegnate come volatile per garantire che il compilatore non riordina accede alla memoria.

Oggetti che vengono dichiarati come volatile non è utilizzato in determinate ottimizzazioni perché i valori possono cambiare in qualsiasi momento.Il sistema indica sempre il valore corrente di un oggetto volatile quando richiesto, anche se un'istruzione precedente è richiesto un valore dallo stesso oggetto.Inoltre, il valore dell'oggetto viene scritto immediatamente nell'assegnazione.

ISO conforme

Se si ha dimestichezza con la parola chiave di Volatile c, o il familiarità con il comportamento di volatile le versioni precedenti di Visual C++, tenere presente che la parola chiave di volatile dello standard ISO di C++11 È diversa ed è supportata in Visual Studio quando l'opzione del compilatore di /volatile: ISO è specificata.(Per il monitoraggio ARM, specificato per impostazione predefinita).La parola chiave di volatile nel codice dello standard ISO di C++11 Deve essere utilizzata solo per accedere hardware, non utilizzare per la comunicazione tra il thread.Per la comunicazione tra il thread, meccanismi di utilizzo come std::atomic<T> da Libreria di modelli standard di C++.

Specifici di Microsoft

Quando l'opzione del compilatore di /volatile:ms è di per impostazione predefinita quando le architetture diverso dal monitoraggio ARM vengono indirizzate al 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 in un oggetto volatile (anche noto come volatile scrivere) ha semantica della versione, ovvero un riferimento a un oggetto globale o statica che si verifica prima che la scrittura in un oggetto volatile nella sequenza di istruzione si verifica prima che sia volatile scrive nel file binario compilato.

  • Lettura di un oggetto volatile (anche noto come volatile lettura) ha acquisire la semantica; ovvero un riferimento a un oggetto globale o statica che si verifica dopo avere letto la memoria volatile nella sequenza di istruzioni viene quindi eseguito il volatile letta nel binario compilato.

In questo modo gli oggetti volatili da utilizzare per i blocchi e le versioni di memoria in applicazioni multithreading.

[!NOTA]

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

Vedere anche

Riferimenti

Parole chiave C++

const (C++)

const e puntatori volatili