Чи робить структура нестабільною нестабільністю всіх її членів?


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теж?

Моя відповідь: так. Якщо ви оголосите об'єкт типу whateverwith, constтоді всі його члени будуть constтеж

Подібним чином, якщо ви оголосите об'єкт типу whateverз, volatileтоді всі його члени будуть volatileзанадто, як і якщо ви оголосите об'єкт за допомогою const, всі його члени будуть constтеж.

constі volatileє двома гранями однієї монети; вони такі, що Стандарт часто називає їх як cv-qualifiers.


Цитування зі стандарту ($ 7.1.5.1 / 8)

[Примітка: volatile - це натяк на реалізацію, щоб уникнути агресивної оптимізації за участю об’єкта, оскільки значення об’єкта може бути змінено засобами, не виявленими реалізацією. Детальну семантику див. У 1.9. Взагалі, семантика летючої має бути такою ж у C + +, як і в C.]

Це означає, що якщо ваш об'єкт є екземпляром структури, то компілятор не може уникнути агресивної оптимізації за участю об'єкта , якщо він не уникає агресивної оптимізації кожного з його членів. (Інакше, як інакше можна уникнути оптимізації за участю об’єкта?)


Пов’язана тема:

Чому ми використовуємо нестабільне ключове слово в C ++?


Важливо зазначити, що констистенція поширюється лише на безпосередніх членів. Якщо ваша структура містить покажчик на якийсь об'єкт, сам покажчик буде const (наприклад, ви не зможете перепризначити його), але ви зможете змінити об'єкт, на який вказують. (припускаючи, що ваша структура не наводить вказівник на 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
Не відповідь на запитання
Якоб ван Віфлеєм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.