Есть ли практическое применение для указателя «volatile restrict»? - PullRequest
12 голосов
/ 24 января 2012

Я вижу практическое применение для квалифицированной переменной const volatile, например

const volatile uint64_t seconds_since_1970;

если базовый аппаратный механизм обновляет значение каждую секунду, но переменная недоступна для записи в (возможно, встроенном) оборудовании. И поскольку все три (четыре в C11) квалификатора типа считаются независимыми, все комбинации, по-видимому, разрешены. Но я в недоумении представляю себе реальную ситуацию, когда квалифицированный указатель restrict volatile действительно имеет смысл:

uint32_t * restrict volatile pointer_to_some_uint32;

[РЕДАКТИРОВАТЬ: Чтобы уточнить: volatile и restrict применяются к указателю, а не к объекту, на который указывает!]

Это конструкция, разрешенная языком, но бесполезная сама по себе, или я упускаю область приложения, где это может быть полезным?

1 Ответ

8 голосов
/ 24 января 2012

Без ограничения, энергонезависимый указатель может создать псевдоним энергозависимого указателя.Таким образом, после каждой модификации объекта с помощью энергозависимого указателя значения в кэше регистров всех потенциально ссылочных объектов одного и того же типа должны отбрасываться.

С помощью restrict вы можете сообщить компилятору энергозависимый указательне будет псевдонимом, так что накладные расходы volatile применяются только к указанному объекту, а не ко всем другим объектам того же типа, которые могут быть доступны через указатели.

...