Делает ли система волатильностью все ее члены неустойчивыми?

Если у меня есть:

 struct whatever {
int data;
};
volatile whatever test;
будет test.data слишком изменчивым?

Ответ 1

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

Делает ли struct 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 для подробного семантика. В общем, семантика летучих являются то же самое в C + +, как и в C.]

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


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

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

Ответ 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;