Если у меня есть:
struct whatever {
int data;
};
volatile whatever test;
будет test.data
слишком изменчивым?Если у меня есть:
struct whatever {
int data;
};
volatile whatever test;
будет test.data
слишком изменчивым?Можно задать другой вопрос (или просто другой способ посмотреть исходный вопрос):
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.]
Это означает, что если ваш объект является экземпляром структуры, то компилятор не может избежать агрессивной оптимизации с участием объекта, , если не избегает агрессивной оптимизации каждого из его членов. (В противном случае, как еще можно избежать оптимизации с участием объекта?)
Связанная тема:
От: 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;