Используйте `volatile` только для взаимодействия с памятью, не являющейся C++
Причина
volatile используется для обозначения объектов, которые совместно используются с кодом "не C++" или оборудованием, которое не следует модели памяти C++.
Пример
const volatile long clock;
Это описывает регистр, постоянно обновляемый схемой часов. clock является volatile, потому что его значение будет изменяться без каких-либо действий программы C++, которая его использует. Например, чтение clock дважды часто дает два разных значения, поэтому оптимизатору лучше не оптимизировать второе чтение в этом коде:
long t1 = clock;
// ... не используется clock здесь ...
long t2 = clock;
clock является const, потому что программа не должна пытаться писать в clock.
Примечание
Если вы не пишете код самого низкого уровня, непосредственно манипулирующий аппаратным обеспечением, рассмотрите volatile как эзотерическую функцию, которой лучше избегать.
Пример
Обычно код C++ получает память volatile, которой владеет что-то другое (оборудование или другой язык):
int volatile* vi = get_hardware_memory_location();
// примечание: здесь мы получаем указатель на чужую память
// volatile говорит "обращайтесь с этим с большим уважением"
Иногда код C++ выделяет память volatile и делит ее с "где-то еще" (оборудование или другой язык), намеренно удаляя указатель:
static volatile long vl;
please_use_this(&vl); // удалить ссылку на это в "где-то еще" (не C++)
Плохой пример
Локальные переменные volatile почти всегда неправильны — как они могут быть общей с другими языками или оборудованием, если они эфемерны? То же самое относится почти в равной степени к членам данных по той же причине.
void f()
{
volatile int i = 0; // плохо, локальная переменная volatile
// и т. д.
}
class My_type {
volatile int i = 0; // подозрительно, член данных volatile
// и т. д.
};
Примечание
В C++, в отличие от некоторых других языков, volatile не имеет отношения к синхронизации.
Применение
- Отметьте
volatile Tлокальные и члены данных; почти несомненно вы намеревались использоватьatomic<T>вместо этого. - ???