Tornar uma estrutura volátil torna todos os seus membros voláteis?

96

Se eu tiver:

struct whatever {
int data;
};
volatile whatever test;
será test.datavolátil também?

Marca
fonte
4
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?)


Tópico relacionado:

Por que usamos a palavra-chave volátil em C ++?

Nawaz
fonte
É 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)
Pablo Arias
-2

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:

const char *cpch;
volatile char *vpch;

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:

char * const pchc;
char * volatile pchv;
Virtualmente real
fonte
3
Não é uma resposta à pergunta
Jakob van Bethlehem