什么是“不可检测的手段”,它们如何改变C / C ++程序的对象?

问题描述 投票:0回答:1

[在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的值编译器没有意识到,因为它可以没看到但这就是您设计的方式。在这种情况下,编译器的优化将无法产生预期的结果!

但是不幸的是,他错过了解释这些可能从程序外部更改对象的“方法”以及它们如何更改对象的解释。


我的问题:

  • 这些“无法检测的手段”的例子是什么,它们如何能够从程序外部更改程序的内部对象?
c++ c object memory volatile
1个回答
4
投票

相同或其他程序的其他部分可能会看到内存中的指针。例如,共享内存中存在的变量可以被另一个程序更改。

编译器无法检测到。

其他示例是基于硬件的内存位置。

通常,需要可变变量的应用程序通常处理异步音频之类的东西,并且在系统级别处理中断,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,则编译器将继续在循环中读取它。

© www.soinside.com 2019 - 2024. All rights reserved.