«Volatile» только мешает оптимизации компилятора?

0

Я знаю, что есть много вопросов о volatile но я думаю, что задаю другой вопрос. Я не спрашиваю, что она делает (в целом), на мой вопрос: имеет ли volatile ключевое слово ТОЛЬКО предотвратить компилятор от оптимизации кода, который использует летучий переменную или что - нибудь еще, что это ключевое слово делает?

  • 0
    volatile то, что он делает, было подробно рассмотрено вчера только в stackoverflow.com/questions/26307071/… .
  • 0
    Именно поэтому я задал свой вопрос и почему я задал его таким образом. Это простой вопрос «да» или «нет», я не хочу, чтобы огромный список всего, что делает volatile .
Теги:
volatile

2 ответа

4

Оставьте компилятор. Компилятор является наименее интересным аспектом C++ и обычно не играет роли в том, как вы думаете об этом языке.

Язык говорит об volatile:

1.9, 1 парафраз:

Доступ к неустойчивым объектам оценивается строго в соответствии с правилами абстрактной машины.

...

Доступ к объекту, обозначенному volatile glvalue, является побочным эффектом, который является изменением состояния среды выполнения.

...

Реализация может предполагать, что любой поток в конечном итоге сделает одно из следующего:

  • ...
  • доступ или изменение изменчивого объекта
  • ...

Итак, как вы можете видеть, volatile объекты в некотором смысле являются частью интерфейса вашей программы с внешним миром. Одним из следствий является то, что волатильный доступ получает определенные гарантии заказа, но это только деталь. Большая картина заключается в том, что volatile средства "могут взаимодействовать с окружающей средой".

  • 0
    Более ранние версии C ++ (без многопоточности) указаны еще меньше. По сути, то, что на самом деле означает volatile определяется реализацией.
2

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

Обратите внимание, что это не помешает переупорядочению всех non- volatile папок вокруг volatile. Это только гарантирует, что доступ к volatile памяти не будет переупорядочен по отношению друг к другу (и что они не будут полностью оптимизированы)

  • 1
    Я думаю, что это больше, чем просто заказ? Например, если вы читаете из изменчивой переменной дважды подряд, тогда переменная должна быть прочитана дважды, то есть она не может быть прочитана один раз, а значение используется повторно?
  • 0
    Это часть сделки. Вы не можете сохранить исходный порядок, если добавляете или удаляете новые звонки. Как я уже сказал, они «гарантированно происходят в порядке, указанном в программе». Другими словами, они не могут быть добавлены, удалены или переупорядочены. Извините, если неясно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню