Volatile vs. mutable в С++

У меня вопрос о разнице между изменчивым и изменчивым. Я заметил, что оба эти средства означают, что это можно изменить. Что еще? Они то же самое? Какая разница? Где они применимы? Почему предлагаются две идеи? Как использовать их по-разному?

Большое спасибо.

Ответ 1

Поле

A mutable может быть изменено даже в объекте, доступ к которому осуществляется через указатель или ссылку const или в объекте const, поэтому компилятор не знает, чтобы его хранить в памяти R/O. A volatile - это местоположение, которое может быть изменено кодом, компилятором которого не известно (например, некоторым драйвером уровня ядра), поэтому компилятор знает, что он не оптимизирует, например. зарегистрируйте присвоение этого значения в соответствии с недопустимым предположением о том, что значение "невозможно изменить", поскольку оно было загружено последним в этот регистр. Очень различная информация, предоставляемая компилятору для остановки очень разных видов недопустимых оптимизаций.

Ответ 2

mutable: Изменчивое ключевое слово переопределяет любую прилагаемую инструкцию const. Изменчивый член объекта const может быть изменен.

volatile: ключевое слово volatile является модификатором, зависящим от реализации, который используется при объявлении переменных, что мешает компилятору оптимизировать эти переменные. Volatile следует использовать с переменными, значение которых может изменяться неожиданными способами (т.е. Через прерывание), что может противоречить оптимизации, которые может выполнять компилятор.

Источник

Ответ 3

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

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

Ответ 4

Грубый, но эффективный способ мышления о различии:

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

Ответ 5

Переменная с надписью mutable позволяет изменять ее в объявленном методе const.

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

Ответ 6

Я хотел бы добавить, что volatile также очень полезен при работе с многопоточными приложениями, т.е. у вас есть основной поток (где живет main()), и вы создаете рабочий поток, который будет продолжать вращаться, а переменная "app_running" правда. main() определяет, является ли "app_running" истинным или ложным, поэтому, если вы не добавляете изменчивый атрибут в объявление "app_running" , если компилятор оптимизирует доступ к "app_running" в коде, запущенном вторичным потоком, main ( ) может изменить "app_running" на false, но вторичный поток будет продолжать работать, потому что значение кэшировано. Я видел такое же поведение, используя gcc для Linux и VisualС++. Атрибут "volatile", помещенный в объявление "app_running" , решил проблему. Таким образом, это сценарий, при котором никакие аппаратные прерывания или ядро ​​не используются при изменении значения таких переменных.