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
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de