什么是"undetectable means",它们如何更改 C/C++ 程序的对象?

What are "undetectable means" and how can they change objects of a C/C++ program?

本文关键字:C++ 程序 对象 何更改 undetectable means 什么      更新时间:2023-10-16

在ISO/IEC 14882:2003(C++03(中,在7.1.5.1/8的"简历"一节中作了规定:

[注意:易失性是对实现的提示,以避免涉及对象的激进优化,因为对象的值可能会通过实现无法检测到的方式进行更改。有关详细的语义,请参见 1.9。一般来说,易失性的语义在C++中与在C中相同。


这些无法被实现检测到的"手段"也已经成为Nawaz的问答主题。 为什么我们使用易失性关键字:

但是,有时(程序的某些部分(优化可能是不可取的,因为可能是其他人正在更改编译器不知道的程序外部some_int的值,因为它看不到它;但这就是你设计它的方式。在这种情况下,编译器的优化不会产生预期的结果!

但不幸的是,他错过了解释这些"含义",可能会改变程序外部的对象,以及它们如何改变对象。


我的问题:

  • 这些"无法检测的手段"的例子是什么,它们如何能够从外部更改程序的内部对象?

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

编译器无法检测到这一点。

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

通常,需要易失变量的应用通常会处理异步音频等内容,在系统级别处理中断、APIC 等。大多数应用程序不需要它们。

一个虚构的例子:

int v = 0;
// Some thread
SetUpdatesOn(&v);
// Another thread
for(;;)
{
int g = v;
std::cout << g;
}

假设一个虚构的操作系统级函数SetUpdatesOn定期更改传递给它的变量。如果变量未声明为易失性,编译器可能会优化int g = v调用或假定v始终具有相同的值。

如果变量被声明为易失性,编译器将继续在循环中读取它。

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