Excelente pergunta. Eu li que ter uma volatilefunção de membro apenas torna o thisponteiro volátil, portanto, os membros serão lidos da memória cada vez que forem acessados, mas não são "oficialmente" voláteis.
Alexandre C.
2
Possivelmente uma duplicata , mas ainda assim uma boa pergunta.
Sergei Tachenov
Respostas:
119
Outra pergunta pode ser feita (ou simplesmente outra maneira de ver a pergunta original):
Fazer uma estrutura consttorna todos os seus membros const?
Se eu tiver:
struct whatever {int data;};const whatever test;
O test.data consttambém será ?
Minha resposta é: sim. Se você declarar um objeto do tipo whatevercom const, em seguida, todos os seus membros será constmuito
Da mesma forma, se você declarar um objeto do tipo whatevercom, volatileentão todos os seus membros serão volatiletambém, assim como se você declarar o objeto com const, todos os seus membros também serão const.
conste volatilesão duas faces da mesma moeda; eles são de modo que o Padrão freqüentemente se refere a eles como cv-qualifiers.
Citando do padrão ($ 7.1.5.1 / 8)
[Nota: volatile é uma dica para a implementação para evitar otimização agressiva envolvendo o objeto
porque o valor do objeto pode ser alterado por meios indetectáveis por uma implementação. Veja 1.9 para semântica detalhada. Em geral, a semântica de volátil deve ser a mesma em C ++ e em C.]
Isso significa que, se o seu objeto é uma instância de uma estrutura, o compilador não pode evitar a otimização agressiva envolvendo o objeto , a menos que evite a otimização agressiva de cada um de seus membros. (Caso contrário, de que outra forma ele pode evitar a otimização envolvendo o objeto?)
É importante notar que a constância é propagada apenas para membros imediatos. Se sua estrutura contém um ponteiro para algum objeto, o próprio ponteiro será const (por exemplo, você não poderá reatribuí-lo), mas poderá alterar o objeto que está sendo apontado. (presumindo que sua estrutura não tenha um ponteiro para const)
volatile
função de membro apenas torna othis
ponteiro volátil, portanto, os membros serão lidos da memória cada vez que forem acessados, mas não são "oficialmente" voláteis.Respostas:
Outra pergunta pode ser feita (ou simplesmente outra maneira de ver a pergunta original):
Fazer uma estrutura
const
torna todos os seus membrosconst
?Se eu tiver:
O test.data
const
também será ?Minha resposta é: sim. Se você declarar um objeto do tipo
whatever
comconst
, em seguida, todos os seus membros seráconst
muitoDa mesma forma, se você declarar um objeto do tipo
whatever
com,volatile
então todos os seus membros serãovolatile
também, assim como se você declarar o objeto comconst
, todos os seus membros também serãoconst
.const
evolatile
são duas faces da mesma moeda; eles são de modo que o Padrão freqüentemente se refere a eles comocv-qualifiers
.Citando do padrão ($ 7.1.5.1 / 8)
Isso significa que, se o seu objeto é uma instância de uma estrutura, o compilador não pode evitar a otimização agressiva envolvendo o objeto , a menos que evite a otimização agressiva de cada um de seus membros. (Caso contrário, de que outra forma ele pode evitar a otimização envolvendo o objeto?)
Tópico relacionado:
Por que usamos a palavra-chave volátil em C ++?
fonte
De: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx
Para declarar o objeto apontado pelo ponteiro como const ou volátil, use uma declaração do formulário:
Para declarar o valor do ponteiro - ou seja, o endereço real armazenado no ponteiro - como const ou volátil, use uma declaração no formato:
fonte