2012-01-24 2 views
11

Я могу видеть практическое применение для квалифицированного переменной const volatile, какЕсть ли практическое применение для указателя `volatile restrict`?

const volatile uint64_t seconds_since_1970; 

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

uint32_t * restrict volatile pointer_to_some_uint32; 

[EDIT: Для уточнения: Оба volatile и restrict применяются к указателю, а не объект указал to!]

Является ли это конструкцией, разрешенной языком, но бесполезной сама по себе, или мне не хватает какой-либо области приложения, где это может быть ценным?

+0

Four? 'const' 'volatile'' ограничивать ...... Не могли бы вы рассказать мне, что такое четвертый квалификатор? Извините за мои небольшие знания> o < – ikh

+0

@ikh C11 определяет классификатор '_Atomic'. –

ответ

8

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

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

+0

В моем примере «volatile» применяется к указателю, а не к объекту, на который он указывает. Я знаю, что использование 'volatile uint32_t * ограничивает указатель;' может быть очень полезным, но объявление самого указателя как 'volatile', так и' ограничение' не переносит 'volatile' на указанный объект, не так ли? –

+1

@Johan: Подумайте, что, возможно, базовый аппаратный механизм время от времени обновляет 'pointer_to_some_uint32' (что надуманно, но реализация может это сделать), и, кроме того, адрес, который он пишет там, гарантированно не будет сглажен ни одним другой указатель. Тогда это 'volatile restrict'. Обычно, 'ограничение' хорош для аргументов функции, а' volatile' бесполезен для локальных переменных, поэтому вы выбрали пример, который вряд ли будет использоваться, хотя он не является абсолютно бесполезным. –

+0

@SteveJessop Да, это и моя интерпретация. Единственное, что я придумал, это некоторая сборка памяти для сборщика мусора и работа в другом контексте потока/процесса. Такие указатели могут быть как «volatile» (поскольку GC может изменить указатели), так и «ограничивать», если другие указатели не указывают на разделы GC-admin в блоках памяти, поддерживаемых GC. Но ответ от @R .. кажется, указывает на объект, на который указывает «наследует» «volatile» («накладные расходы волатильны применимы только к объекту, на который указывает»), что является неправильным IMHO. –

Смежные вопросы