我有一个关于volatile和mutable的差异问题。我注意到两者都表示它们可能会改变。除此之外还有什么?它们是同样的东西吗?它们的区别在哪里?它们适用于哪些情况?为什么提出这两个想法?如何以不同方式使用它们?
非常感谢。
mutable
字段可以在通过const
指针或引用访问的对象中被更改,也可以在const
对象中被更改,因此编译器知道不要将其存储在只读内存中。 volatile
位置是可以被编译器不知道的代码更改的位置(例如某个内核级驱动程序),因此编译器知道不要优化该值的寄存器分配,因为它可能已经自上次加载后被更改了。这是给编译器提供的非常不同类型的信息,以阻止非常不同类型的无效优化。
mutable
: mutable关键字可以覆盖任何封闭的const语句。一个const对象的可变成员可以被修改。
volatile
: volatile关键字是一个依赖实现的修饰符,用于声明变量,防止编译器优化这些变量。应该在值可能以意想不到的方式改变(例如通过中断)的变量上使用volatile,这可能会与编译器执行的优化相冲突。
它们绝对不是同一件事。 Mutable 与 const 相互作用。如果您有一个 const 指针,则通常不能更改成员变量。 Mutable提供了这个规则的例外。
另一方面,Volatile与程序所做的更改完全无关。它意味着内存可能因编译器无法控制的原因而发生变化,因此编译器必须每次读取或写入内存地址,并且无法将内容缓存到寄存器中。
T
的对象的地址,并将其存储到const T *
中并从中读取。如果将该对象设置为volatile
,即使您从未尝试写入,将其地址存储到const T *
中也会失败。 volatile
和程序代码中的更改/修改/内存写入是完全不相关的。 - Ben Voigt一个粗糙但有效的比较方式是:
volatile
bytes_received,mutable
reference_count。 - Mike DeSimone在声明为const
的方法中,标记为mutable
的变量可以被修改。
标记为volatile
的变量告诉编译器每次按照代码所示都必须读取/写入该变量(即不能优化掉对变量的访问)。
x = 1; x = 0;
如果x
是 volatile 的,则编译器必须发出两个写操作(这可能在硬件级别上很重要)。但是,对于非 volatile 对象,编译器可能会选择不费力地写入1
,因为它从未被使用过。 - Michael Burrconst
和volatile
!你不能改变这个对象,但是它在背后可能会被修改。 - CTMacUser