[在ISO / IEC 14882:2003(C ++ 03)中,在7.1.5.1/8中的“ cv限定词”部分中进行了说明:
[[注:volatile是实现的一种暗示,以避免涉及对象的积极优化因为该对象的值可能通过实现无法检测到的方式进行更改。有关详细语义,请参见1.9。通常,volatile的语义在C ++中应与在C中相同。]
[这些“方法”,在实现中无法检测到,这也是Nawaz的问与答Why do we use volatile keyword的主题:
但是,有时(对程序的某些部分进行的优化)可能是不可取的,因为可能是其他人正在从程序外部更改some_int的值编译器没有意识到,因为它可以没看到但这就是您设计的方式。在这种情况下,编译器的优化将无法产生预期的结果!
但是不幸的是,他错过了解释这些可能从程序外部更改对象的“方法”以及它们如何更改对象的解释。
我的问题:
相同或其他程序的其他部分可能会看到内存中的指针。例如,共享内存中存在的变量可以被另一个程序更改。
编译器无法检测到。
其他示例是基于硬件的内存位置。
通常,需要可变变量的应用程序通常处理异步音频之类的东西,并且在系统级别处理中断,APIC等。大多数应用程序不需要它们。
一个假想的例子:
int v = 0;
// Some thread
SetUpdatesOn(&v);
// Another thread
for(;;)
{
int g = v;
std::cout << g;
}
假设虚拟OS级功能SetUpdatesOn
定期更改传递给它的变量。如果未将变量声明为volatile,则编译器可能会优化int g = v
调用或假定v
始终具有相同的值。
如果变量声明为volatile,则编译器将继续在循环中读取它。