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

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

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


我的问题:

  • 这些“无法检测的手段”有哪些例子?它们如何能够从程序外部更改程序的内部对象?
ly122653002 回答:什么是“无法检测的手段”,它们如何改变C / C ++程序的对象?

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

编译器无法检测到。

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

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

请注意,通常很难调试此类编程错误,因为优化可能仅存在于发行版中。

本文链接:https://www.f2er.com/2744361.html

大家都在问