volatile (C++)

Квалификатор типа, который используется для объявления о том, что объект может быть изменен в программе аппаратным обеспечением.

Синтаксис

volatile declarator ;

Замечания

Чтобы изменить способ интерпретации этого ключевое слово, можно использовать параметр компилятора /volatile компилятора.

Visual Studio интерпретирует volatile ключевое слово по-разному в зависимости от целевой архитектуры. Для ARM, если параметр компилятора /volatile не указан, компилятор выполняется так, как если бы задано значение /volatile:iso . Для архитектур, отличных от ARM, если параметр /volatile компилятор не указан, компилятор выполняется так, как если бы задано значение /volatile:ms; поэтому для архитектур, отличных от ARM, настоятельно рекомендуется указать /volatile:iso и использовать явные примитивы синхронизации и встроенные компоненты компилятора при работе с памятью, к которой используется общий доступ между потоками.

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

Если volatile используется в переменной, которая также имеет __restrict ключевое слово, volatile имеет приоритет.

struct Если элемент помечен как volatile, то volatile распространяется на всю структуру. Если структура не имеет длины, которая может быть скопирована в текущей архитектуре с помощью одной инструкции, volatile может быть полностью потеряна в этой структуре.

Ключевое слово volatile может не влиять на поле, если одно из следующих условий имеет значение true:

  • Длина поля с ключевым словом volatile превышает максимальный размер, который в текущей архитектуре может быть скопирован с помощью одной инструкции.

  • Длина самого внешнего содержащегося struct(или если она является членом, возможно, вложенным struct) превышает максимальный размер, который можно скопировать на текущую архитектуру с помощью одной инструкции.

Несмотря на то, что обработчик не изменяет порядок доступа к кэшируемой памяти, не кэшируемые переменные должны быть помечены так, volatile чтобы гарантировать, что компилятор не переупорядочение доступа к памяти.

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

Соответствие ISO

Если вы знакомы с переменным ключевое слово C# или знакомы с поведением volatile в более ранних версиях компилятора Microsoft C++ (MSVC), помните, что стандарт ISO C++11 стандарт КЛЮЧЕВОЕ СЛОВО volatile отличается и поддерживается в MSVC при указании параметра компилятора /volatile:iso. (Для архитектуры ARM он установлен по умолчанию). Ключевое слово volatile в коде СТАНДАРТА ISO C++11 следует использовать только для доступа к оборудованию; не используйте его для обмена данными между потоками. Для обмена данными между потоками используйте такие механизмы, как std::atomic<T> из стандартной библиотеки C++.

Конец соответствия ISO

Блок, относящийся только к системам Майкрософт

Если параметр компилятора /volatile:ms используется (по умолчанию при целевых архитектурах, отличных от ARM), компилятор создает дополнительный код для поддержания порядка между ссылками на переменные объекты в дополнение к поддержанию порядка ссылок на другие глобальные объекты. В частности:

  • Запись в объект с ключевым словом volatile (т. н. "запись в изменяемый объект") имеет семантику освобождения. Это означает, что ссылка на глобальный или статический объект, которая находится в последовательности инструкций перед записью в объект с ключевым словом volatile, в скомпилированном двоичном файле будет находиться до записи в изменяемый объект.

  • Считывание из объекта с ключевым словом volatile (т. н. "считывание из изменяемого объекта") имеет семантику получения. Это означает, что ссылка на глобальный или статический объект, которая находится в последовательности инструкций после считывания из объекта с ключевым словом volatile, в скомпилированном двоичном файле будет находиться после считывания из изменяемого объекта.

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

Примечание.

Если он зависит от расширенной гарантии, предоставленной при использовании параметра компилятора /volatile:ms , код не переносим.

Завершение блока, относящегося только к системам Майкрософт

См. также

Ключевые слова
const
Указатели с ключевыми словами const и volatile