Если бы у меня был:
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 для подробной семантики. В общем, семантика volatile в 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;
volatileфункции-члена только делаетthisуказатель изменчивым, поэтому элементы будут считываться из памяти при каждом обращении, но не являются «официально» изменчивыми.