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" , решил проблему. Таким образом, это сценарий, при котором никакие аппаратные прерывания или ядро не используются при изменении значения таких переменных.