4.10 Квалификаторы
- Что считается обращением к объекту, имеющему тип с квалификатором volatile (C90 6.5.3, C99 и C11 6.7.3).
Обычно к такому объекту обращаются с помощью указателей и используют его для доступа к аппаратным средствам. В большинстве выражений интуитивно понятно, что является чтением, а что — записью. Например
volatile int *dst = somevalue; volatile int *src = someothervalue; *dst = *src;
приведёт к чтению volatile-объекта, на который указывает src, и сохранению значения в volatile-объект, на который указывает dst. Нет гарантии, что эти чтения и записи будут атомарными, особенно для объектов размером больше
int.Однако если volatile-хранилище не изменяется и значение volatile-хранилища не используется, ситуация менее очевидна. Например
volatile int *src = somevalue; *src;
Согласно стандарту C, такое выражение является r-значением, тип которого представляет собой неквалифицированную версию исходного типа, то есть
int. Интерпретирует ли GCC это как чтение volatile-объекта, на который указывает указатель, или только как запрос на вычисление выражения ради его побочных эффектов, зависит от этого типа.Если это скалярный тип, агрегатный тип, единственным полем которого на большинстве целевых платформ является объект скалярного типа, либо тип объединения, поля которого имеют скалярные типы, GCC интерпретирует выражение как чтение volatile-объекта; в остальных случаях выражение вычисляется только ради его побочных эффектов.
Когда объект агрегатного типа, имеющий тот же размер и выравнивание, что и скалярный тип
S, становится объектом volatile-доступа в выражении присваивания или атомарной функции, доступ к нему выполняется так, как если бы объявленный тип объекта былvolatile S.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Qualifiers-implementation.html