mutable
Поле может быть изменено даже в объекте , доступном через const
указатель или ссылки, или в const
объекте, так что компилятор знает , чтобы не прятать его в памяти R / O. volatile
Расположение один , который может быть изменен с помощью кода компилятор не знает о (например , каком - то драйвере уровня ядра), так что компилятор не знает , чтобы оптимизировать , например , зарегистрировать присвоение этого значения при недопустимом предположении , что значение «не может иметь изменено "с момента последней загрузки в этот регистр. Очень разная информация передается компилятору, чтобы остановить самые разные недопустимые оптимизации.
volatile
объекты также могут быть изменены процессами, вообще не задействующими ЦП. Например, регистр приема байтов в коммуникационном периферийном устройстве может увеличиваться на единицу при получении байта (и это может даже вызвать прерывание). Другой пример - регистр флагов ожидающих прерываний в периферийном устройстве.volatile
это не только означает, что объект может изменяться вне зависимости от компилятора - это также означает, что записи в объект не могут быть устранены компилятором, даже если эти записи кажутся бесполезными. Например:x = 1; x = 0;
еслиx
является изменчивым, компилятор должен выполнить обе операции записи (что может иметь значение на аппаратном уровне). Однако для энергонезависимого объекта компилятор может не беспокоиться о написании,1
поскольку он никогда не использовался.const
иvolatile
! Поменять предмет нельзя, но можно поменять за спиной.mutable
: Ключевое слово mutable переопределяет любой включающий оператор const. Изменяемый член константного объекта может быть изменен.volatile
: Ключевое слово volatile - это модификатор, зависящий от реализации, используемый при объявлении переменных, который не позволяет компилятору оптимизировать эти переменные. Volatile следует использовать с переменными, значение которых может изменяться неожиданным образом (например, из-за прерывания), что может конфликтовать с оптимизацией, которую может выполнить компилятор.Источник
источник
Volatile should be used with variables whose value can change in unexpected ways
лучше использовать его в случайном порядке?Это определенно НЕ одно и то же. Mutable взаимодействует с const. Если у вас есть константный указатель, вы обычно не можете изменять члены. Mutable представляет собой исключение из этого правила.
Volatile, с другой стороны, совершенно не связано с изменениями, внесенными программой. Это означает, что память может измениться по причинам, не зависящим от компилятора, поэтому компилятор должен каждый раз читать или записывать адрес памяти и не может кэшировать содержимое в регистре.
источник
T
, сохранить его вconst T*
и прочитать из него. Если вы создадите этот объектvolatile
, сохранить его адрес в немconst T*
не удастся, даже если вы никогда не пытаетесь писать.volatile
а изменения / модификации / записи в память из программного кода полностью ортогональны.Грубый, но эффективный способ осмыслить разницу:
источник
volatile
bytes_received,mutable
reference_count.Отмеченная переменная
mutable
позволяет изменять ее в объявленном методеconst
.Отмеченная переменная
volatile
сообщает компилятору, что он должен читать / записывать переменную каждый раз, когда ваш код также сообщает об этом (т.е. он не может оптимизировать доступ к переменной).источник
Я хотел бы добавить, что volatile также очень полезен при работе с многопоточными приложениями, т.е. у вас есть основной поток (где живет main ()), и вы создаете рабочий поток, который будет продолжать вращаться, пока переменная app_running имеет значение true. main () контролирует, является ли app_running истинным или ложным, поэтому, если вы не добавите атрибут volatile к объявлению app_running, если компилятор оптимизирует доступ к app_running в коде, выполняемом вторичным потоком, main ( ) может изменить "app_running" на false, но вторичный поток продолжит работу, потому что значение было кэшировано. Я видел такое же поведение при использовании gcc в Linux и VisualC ++. Атрибут "volatile", помещенный в объявление "app_running", решил проблему. Так,
источник