Делает ли структура изменчивой все ее члены изменчивыми?

96

Если бы у меня был:

struct whatever {
int data;
};
volatile whatever test;
тоже test.dataбудет нестабильным?

отметка
источник
4
Отличный вопрос. Я читал, что наличие volatileфункции-члена только делает thisуказатель изменчивым, поэтому элементы будут считываться из памяти при каждом обращении, но не являются «официально» изменчивыми.
Alexandre C.
2
Возможно дубликат , но все же хороший вопрос.
Сергей Таченов

Ответы:

119

Можно задать другой вопрос (или просто взглянуть на исходный вопрос по-другому):

Делает ли создание структуры constвсе ее членыconst ?

Если бы у меня был:

struct whatever { int data; };

const whatever test;

Будет ли test.data const тоже ?

Мой ответ: да. Если вы объявляете объект типа whateverс, constтогда все его члены будутconst слишком

Точно так же, если вы объявляете объект типа whateverс, volatileтогда все его члены тоже будут volatile, точно так же, как если вы объявляете объект с const, все его члены будутconst .

constи volatileявляются двумя сторонами одной медали; они таковы, что в Стандарте их часто называют cv-qualifiers.


Цитата из Стандарта (7.1.5.1 $ / 8)

[Примечание: volatile - это подсказка для реализации, чтобы избежать агрессивной оптимизации, связанной с объектом, потому что значение объекта может быть изменено средствами, не обнаруживаемыми реализацией. См. 1.9 для подробной семантики. В общем, семантика volatile в C ++ должна быть такой же, как и в C.]

Это означает, что если ваш объект является экземпляром структуры, то компилятор не может избежать агрессивной оптимизации с участием объекта , если он не избегает агрессивной оптимизации каждого из его членов. (В противном случае, как еще можно избежать оптимизации, связанной с объектом?)


Связанная тема:

Почему мы используем ключевое слово volatile в C ++?

Наваз
источник
Важно отметить, что константность распространяется только на непосредственных членов. Если ваша структура содержит указатель на какой-либо объект, сам указатель будет константным (например, вы не сможете переназначить его), но вы сможете изменить объект, на который указывает. (при условии, что ваша структура не содержит указатель на const)
Пабло Ариас
-2

От: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx

Чтобы объявить объект, на который указывает указатель, как const или volatile, используйте объявление формы:

const char *cpch;
volatile char *vpch;

Чтобы объявить значение указателя, то есть фактический адрес, хранящийся в указателе, как const или volatile, используйте объявление формы:

char * const pchc;
char * volatile pchv;
Практически реальный
источник
3
Не ответ на вопрос
Якоб ван Вифлеем