volátil (C++)
Um qualificador do tipo que você pode usar para declarar um objeto que pode ser modificado no programa por hardware.
volatile declarator ;
Comentários
Você pode usar a opção do compilador de /volatile para alterar como o compilador interpreta esta palavra-chave.
O Visual Studio constrói a palavra-chave de volatile de maneira diferente dependendo da arquitetura de destino.Para o BRAÇO, se nenhuma opção de compilador /volatile for especificada, o compilador executa como se /volatile:iso foi especificado.Para diferentes arquiteturas de BRAÇO, se nenhuma opção de compilador /volatile for especificada, o compilador executa como se /volatile:ms foi especificado; como consequência, porque diferentes arquiteturas de BRAÇO é altamente recomendável que você especifica /volatile:iso, e usamos primitivos de sincronização e intrinsics explícitos de compilador quando você está tratando a memória que é compartilhado entre threads.
Você pode usar o qualificador de volatile para fornecer acesso aos locais de memória que são usados por processos como manipuladores assíncronos de interrupção.
Quando volatile é usado em uma variável que também tem a palavra-chave de __restrict , volatile tem precedência.
Se um membro de 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 completamente pode ser perdidas no framework.
A palavra-chave de volatile pode não ter nenhum efeito sobre um campo se uma das seguintes condições forem verdadeiras:
O comprimento do campo temporário excede o tamanho máximo que pode ser copiado na arquitetura atual usando uma instrução.
O comprimento de structrecipiente mais externo — ou seja um membro de structpossivelmente aninhado — excede o tamanho máximo que pode ser copiado na arquitetura atual usando uma instrução.
Embora o processador não reordene acessa de memória un - armazenável em cache, variáveis un - cacheable devem ser marcados como volatile para garantir que o compilador não reordena o acessa de memória.
Objetos que são declarados como volatile não é usado em determinadas otimizações porque seus valores podem alterar a qualquer momento.O sistema sempre ler o valor atual de um objeto temporário quando for solicitado, se uma declaração anterior solicitou um valor do mesmo objeto.Além disso, o valor do objeto é gravado imediatamente na atribuição.
ISO compatível
Se você estiver familiarizado com a palavra-chave de Volátil C# , ou o familiarizado com o comportamento de volatile em versões anteriores do Visual C++, esteja ciente que a palavra-chave de volatile padrão de C++11 ISO é diferente e é suportado no Visual Studio quando a opção de compilador /volatile: ISO é especificado.(Para o BRAÇO, especificado por padrão).A palavra-chave de volatile no código de padrão de C++11 ISO deve ser usada somente para acesso de hardware; não use o para comunicação de inter- segmento.Para comunicação de inter- segmento, use mecanismos como std::atomic<T> de Biblioteca padrão do modelo C++.
Específico da Microsoft
Quando a opção de compilador /volatile:ms é usado - por padrão quando as diferentes arquiteturas de BRAÇO são direcionados - o compilador gera código adicional para manter classificação entre referências a objetos voláteis além de ordenação de aplicativos para referências a outros objetos globais.Em particular:
Uma gravação a um objeto temporário (também conhecido como gravar temporária) tem a semântica de versão; ou seja, uma referência a um objeto global ou estático que ocorre antes que uma gravação a um objeto temporário em sequência de declaração ocorrer antes que temporário gravar no binária compilada.
Uma leitura de um objeto temporário (também conhecido como o volátil ler) tem adquirir a semântica; ou seja, uma referência a um objeto global ou estático que ocorrência de uma após leitura de memória temporária em sequência de declaração ocorrerá em seguida o volátil lê o binária compilada.
Isso permite que objetos a serem voláteis usados para bloqueios e versões de memória em aplicativos multissegmentados.
Observação |
---|
Quando depende da garantia avançado que é fornecida quando a opção de compilador /volatile:ms for usada, o código não é portátil. |