изменчивость и изменчивость в C++



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



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

541   6  

6 ответов:

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

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

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

источник

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

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

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

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

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

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

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

Comments

    Ничего не найдено.