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 annidatostruct
, 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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per