Spec-Zone.ru › GCC 14

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, такое выражение является правой частью (rvalue), тип которой является неквалифицированной версией его исходного типа, т.е. 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-13.3.0/gcc/Qualifiers-implementation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API