Указатель формы
volatile int* p;
является указателем на int
, что компилятор будет трактовать как volatile
. Это означает, что компилятор предположит, что переменная может быть указана на p
, даже если в исходном коде нет ничего, чтобы предположить, что это может произойти. Например, если я установил p
, чтобы указать на обычное целое число, то каждый раз, когда я читаю или пишу *p
, компилятор знает, что значение может неожиданно измениться.
Существует еще один вариант использования для volatile int*
: Если вы объявляете int
в volatile
, то вы не должны указывать на это с регулярной int*
. Например, это плохая идея:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
Причиной этого является то, что компилятор уже не помнит, что переменная, на которую указывает ptr
является volatile
, так что он может кэшировать значение *p
в регистре неправильно , На самом деле, в C++, приведенный выше код является ошибкой. Вместо этого вы должны написать
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
Теперь компилятор запоминает, что указывает на ptr
в volatile int
, поэтому он не будет (или нет! Нужно) пытаться оптимизировать доступ через *ptr
.
Одна последняя деталь - указатель, который вы обсуждали, является указателем на volatile int
. Вы также можете сделать это:
int* volatile ptr;
Это говорит о том, что указатель сам является volatile
, что означает, что компилятор не должен пытаться кэшировать указатель в памяти или попытаться оптимизировать значение указателя, потому что сам указатель может получить переназначен на что-то другое (аппаратное, другой поток, и т.д.) вы можете объединить их вместе, если вы хотите, чтобы получить это животное:
volatile int* volatile ptr;
Это говорит, что как указатель и pointee мог переодеться неожиданно , Компилятор не может оптимизировать сам указатель и не может оптимизировать то, на что указывает.
Надеюсь, это поможет!
Я думаю, вы имеете в виду «вы не должны указывать на него с обычным int *» – markgz
@ markgz- Упс! Да, это правильно. Исправлена. – templatetypedef
Я думаю, что это ошибка и в C, но компиляторы C менее склонны жаловаться на несоответствия типов. –