繁体   English   中英

C ++中的volatile与mutable

[英]volatile vs. mutable in C++

我对volatile和mutable之间的区别有疑问。 我注意到这两个都意味着它可以改变。 还有什么? 它们是一样的吗? 有什么不同? 它们适用于哪里? 为什么提出这两个想法? 如何以不同的方式使用它们?

非常感谢。

即使在通过const指针或引用访问的对象中,或在const对象中,也可以更改mutable字段,因此编译器知道不将其存储在R / O存储器中。 volatile位置是可以通过编译器不知道的代码(例如某些内核级驱动程序)更改的位置,因此编译器知道不会在无效假设值“不可能”的情况下优化例如该值的寄存器赋值已更改“因为它最后一次加载到该寄存器中。 为编译器提供了非常不同类型的信息,以阻止非常不同类型的无效优化。

mutable :mutable关键字覆盖任何封闭的const语句。 可以修改const对象的可变成员。

volatile :volatile关键字是一个依赖于实现的修饰符,在声明变量时使用,这会阻止编译器优化这些变量。 Volatile应该与变量一起使用,其值可能以意外的方式(即通过中断)发生变化,这可能与编译器可能执行的优化冲突。

资源

他们绝对不是一回事。 Mutable与const交互。 如果你有一个const指针,你通常无法更改成员。 Mutable为该规则提供了一个例外。

另一方面,易失性与程序的变化完全无关。 这意味着内存可能因编译器无法控制的原因而发生更改,因此编译器必须每次都读取或写入内存地址,并且无法将内容缓存在寄存器中。

一种粗略但有效的思维方式是:

  • 编译器知道可变对象何时更改。
  • 编译器无法知道volatile对象何时发生更改。

标记为mutable的变量允许在声明为const的方法中对其进行修改。

标记为volatile的变量告诉编译器每次代码都告诉它必须读/写变量(即它不能优化对变量的访问)。

我想补充一点,volatile在处理多线程应用程序时也非常有用,也就是说,你有主线程(main()存在),并且你产生一个工作线程,当变量“app_running”为真时它会继续旋转。 main()控制“app_running”是真还是假,所以如果你没有将volatile属性添加到“app_running”的声明中,如果编译器优化了对辅助线程运行的代码中“app_running”的访问,则为main( )可能会将“app_running”更改为false,但辅助线程将继续运行,因为该值已被缓存。 我在Linux和VisualC ++上使用gcc看到过相同的行为。 放入“app_running”声明的“volatile”属性解决了这个问题。 因此,这是在更改此类变量的值时不会发生硬件中断或内核的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM