У меня есть вопрос о различии между энергозависимым и изменяемым. Я заметил, что оба из двух средств, что это могло быть изменено.Что еще? Действительно ли они - то же самое?Какая разница? Где они применимы? Почему эти две идеи предложены? Как использовать их другим способом?
Большое спасибо.
Поле mutable
может быть изменено даже в объекте, доступ к которому осуществляется через const
указатель или ссылку, или в const
объекте, поэтому компилятор знает, что не следует хранить его в памяти R/O. Место volatile
- это место, которое может быть изменено кодом, о котором компилятор не знает (например, каким-нибудь драйвером уровня ядра), поэтому компилятор знает, что не следует оптимизировать, например, присвоение значения регистру, исходя из неверного предположения, что значение "не может измениться" с момента последней загрузки в этот регистр. Очень разные виды информации, предоставляемые компилятору, чтобы остановить очень разные виды некорректных оптимизаций.
mutable
: ключевое слово mutable переопределяет любой включающий оператор const. Изменяемый член константного объекта может быть изменен.
volatile
: ключевое слово volatile - это модификатор, зависящий от реализации, используемый при объявлении переменных, который не позволяет компилятору оптимизировать эти переменные. Volatile следует использовать с переменными, значение которых может изменяться неожиданным образом (например, через прерывание), что может конфликтовать с оптимизацией, которую может выполнить компилятор.
Это определенно НЕ одно и то же. Mutable взаимодействует с const. Если у вас есть константный указатель, вы обычно не можете изменять члены. Mutable представляет собой исключение из этого правила.
Volatile, с другой стороны, совершенно не связано с изменениями, внесенными программой.Это означает, что память может измениться по причинам, не зависящим от компилятора, поэтому компилятор должен каждый раз читать или записывать адрес памяти и не может кэшировать содержимое в регистре.
Грубый, но эффективный способ понять разницу:
Переменная, помеченная mutable
, позволяет изменять ее в методе, объявленном const
.
Переменная, помеченная volatile
, говорит компилятору, что он должен читать/записывать переменную каждый раз, когда ваш код говорит ему об этом (т.е. он не может оптимизировать доступ к переменной).