Якщо я маю:
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теж?
Моя відповідь: так. Якщо ви оголосите об'єкт типу whateverwith, 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;
volatileфункції-члена лише робитьthisпокажчик мінливим, тому члени будуть зчитуватися з пам'яті кожного разу, коли вони отримують доступ, але не є "офіційно" нестійкими.