энергозависимый по сравнению с изменяемым в C++

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

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

84
задан bitek 13 March 2013 в 12:41
поделиться

5 ответов

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

111
ответ дан 24 November 2019 в 08:31
поделиться

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

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

Источник

27
ответ дан 24 November 2019 в 08:31
поделиться

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

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

22
ответ дан 24 November 2019 в 08:31
поделиться

Грубый, но эффективный способ понять разницу:

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

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

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

11
ответ дан 24 November 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: