6 ответов:
A
mutableполе может быть изменено даже в объекте доступ черезconstуказатель или ссылка, или вconstобъект, так что компилятор знает, чтобы не прятать его в R/O памяти. Аvolatilelocation-это тот, который может быть изменен кодом, о котором компилятор не знает (например, какой-то драйвер уровня ядра), поэтому компилятор не знает, чтобы оптимизировать, например, назначение регистра этого значения при недопустимом предположении, что значение "не может быть изменено" с момента его последней загрузки в этот файл реестр. Очень разная информация предоставляется компилятору, чтобы остановить очень разные виды недопустимых оптимизаций.
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