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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по