Указатель вида
volatile int* p;
- это указатель на int
, который компилятор будет обрабатывать как volatile
.Это означает, что компилятор будет предполагать, что переменная, на которую указывает p
, может измениться, даже если в исходном коде нет ничего, что могло бы предположить, что это может произойти.Например, если я установлю p
на обычное целое число, то каждый раз, когда я читаю или пишу *p
, компилятор осознает, что значение могло неожиданно измениться.
Существует еще один вариант использованиядля volatile int*
: если вы объявите int
как volatile
, то вам не следует указывать на него обычным int*
.Например, это плохая идея:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
Причина этого в том, что компилятор C больше не помнит, что переменная, на которую указывает 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;
Это говорит о том, что оба указателяи пуанти может неожиданно измениться.Компилятор не может оптимизировать сам указатель и не может оптимизировать то, на что он указывает.
Надеюсь, это поможет!