Есть ли практическое применение для указателя "volatile restrict"?
Я вижу практическое применение const volatile
квалифицированная переменная, как
const volatile uint64_t seconds_since_1970;
если базовый аппаратный механизм обновляет значение каждую секунду, но переменная недоступна для записи в (возможно, встроенном) оборудовании. И поскольку все три (четыре в C11) квалификатора типа считаются независимыми, все комбинации, по-видимому, разрешены. Но я в недоумении представляю реальную ситуацию, когда restrict volatile
квалифицированный указатель действительно имеет смысл:
uint32_t * restrict volatile pointer_to_some_uint32;
[Редактировать: уточнить: оба volatile
а также restrict
применять к указателю, а не к объекту, на который указывает!]
Это конструкция разрешена языком, но бесполезна сама по себе, или я упускаю какую-то область приложения, где это может быть полезным?
1 ответ
Без ограничений, энергонезависимый указатель может создать псевдоним энергозависимого указателя. Таким образом, после каждой модификации объекта с помощью энергозависимого указателя значения в кэше регистров всех потенциально ссылающихся объектов одного и того же типа должны быть отброшены.
С помощью restrict вы можете указать компилятору, что указатель volatile не будет псевдонимом, так что накладные расходы volatile применяются только к указанному объекту, а не ко всем другим объектам того же типа, которые могут быть доступны через указатели.