Compartilhar via


volatile (C++)

Um qualificador de tipo que você pode usar para declarar que um objeto pode ser modificado no programa pelo hardware.

Sintaxe

volatile declarator ;

Comentários

Você pode usar o switch do compilador /volatile para modificar como o compilador interpreta essa palavra-chave.

O Visual Studio interpreta a palavra-chave volatile de modo diferente de acordo com a arquitetura de destino. Para ARM, se nenhuma opção de compilador /volatile for especificada, o compilador será executado como se /volatile:iso fosse sido especificado. Para arquiteturas que não sejam ARM, se nenhuma opção de compilador /volatile for especificada, o compilador será executado como se /volatile:ms tivesse sido especificado. Portanto, para arquiteturas que não sejam ARM, é altamente recomendável especificar /volatile:iso e usar primitivos de sincronização explícitos e intrínsecos do compilador ao gerenciar memória compartilhada entre threads.

Use o qualificador volatile para fornecer acesso aos locais de memória usados por processos assíncronos, como manipuladores de interrupção.

Quando volatile é usado em uma variável que também tem a palavra-chave __restricttem precedência volatile.

Se um membro struct é marcado como volatile, então volatile é propagado para a estrutura inteira. Se uma estrutura não tem um tamanho que pode ser copiado na arquitetura atual usando uma instrução, volatile pode ser completamente perdido nessa estrutura.

A palavra-chave volatile pode não ter nenhum efeito sobre um campo se uma das seguintes condições for verdadeira:

  • O tamanho do campo volátil excede o tamanho máximo que pode ser copiado na arquitetura atual usando uma instrução.

  • O tamanho do contentor mais externo struct— ou se for um membro de uma possivelmente aninhadastruct— excede o tamanho máximo que pode ser copiado para a arquitetura atual usando uma instrução.

Embora o processador não reorganize acessos à memória sem cache, as variáveis sem cache devem ser marcadas comovolatile para garantir que o compilador não reorganize os acessos de memória.

Objetos que são declarados como volatile não são usados em determinadas otimizações porque seus valores podem ser alterados a qualquer momento. O sistema sempre lê o valor atual de um objeto volátil quando solicitado, mesmo que uma instrução anterior tenha solicitado um valor do mesmo objeto. Além disso, o valor do objeto é gravado imediatamente na atribuição.

Conforme ISO

Se você estiver familiarizado com a palavra-chave C# volatile ou com o comportamento de volatile em versões anteriores do compilador Microsoft C++ (MSVC), lembre-se de que a palavra-chave volatile do C++11 ISO Standard é diferente e dá suporte no MSVC quando a opção de compilador /volatile:iso é especificada. (Para ARM, ela é especificada por padrão). A palavra-chave volatile no código C++11 ISO Standard deve ser usada somente para acesso de hardware. Não a use para comunicação entre threads. Para comunicação entre threads, use mecanismos como std::atomic<T> da Biblioteca C++ Standard.

Fim da conformidade com a ISO

Seção específica da Microsoft

Quando a opção de compilador /volatile:ms é usada é usada (por padrão quando as arquiteturas que não sejam ARM são segmentadas), o compilador gera códigos adicionais para manter a ordem entre referências a objetos voláteis, além de manter a ordem para referências a outros objetos globais. Especialmente:

  • Uma gravação em um objeto volátil (também conhecida como gravação volátil) tem semântica de versão; ou seja, uma referência a um objeto global ou estático que ocorre antes de uma gravação em um objeto volátil na sequência da instrução ocorrerá antes dessa gravação volátil no binário compilado.

  • Uma leitura de um objeto volátil (também conhecida como leitura volátil) tem semântica de aquisição; ou seja, uma referência a um objeto global ou estático que ocorre depois de uma leitura de memória volátil na sequência da instrução ocorrerá depois dessa leitura volátil no binário compilado.

Isso permite que os objetos voláteis sejam usados para versões e bloqueios de memória em aplicativos multithread.

Observação

Quando depende da garantia aprimorada que é fornecida quando a opção de compilador /volatile:ms é usado, o código é não portátil.

Fim da seção específica da Microsoft

Confira também

Palavras-chave
const
Ponteiros const e volatile