Ключевое слово volatile используется в C, чтобы предотвратить компилятор, выполняющий определенные оптимизации, среди других тонких изменений, для переменной.
Например:
volatile int my_int = 0;
создает целое число. В некоторых ситуациях это может предотвратить следующую оптимизацию:
while(my_int == 0); // Loop until my_int != 0
Оптимизировать до:
while(1); // Loop infinity.
Это полезно для ситуаций, в том числе часто встречающихся во встроенных системах, таких как ситуация, когда изменение переменной может быть вызвано вызовом функции прерывания. Есть много других примеров того, где этот метод полезен. my_int
может быть флагом, который модифицируется такой функцией. (Это просто игрушечная модель.)
Однако рассмотрим случай, когда данные, измененные функцией, являются массивом. На указатели можно указать указатель.
unsigned char* my_data = new unsigned char[256];
В этом случае, учитывая, что my_data является глобальной переменной в этой конкретной ситуации этого вопроса [1], является ли избыточное ключевое слово volatile
, или оно все еще требуется?
[1] Это не имеет значения.
Если ответ заключается в том, что требуется ключевое слово volatile, для чего это правильный синтаксис?
Например, volatile unsigned char* my_data
, я предполагаю, что сам указатель является volatile, а не данные, на которые он указывает.
Наконец, существует ли разница между использованием в C и С++?