C++ 什么是「;“不可检测”是指;他们如何更改C/C的对象++;节目?

C++ 什么是「;“不可检测”是指;他们如何更改C/C的对象++;节目?,c++,c,object,memory,volatile,C++,C,Object,Memory,Volatile,ISO/IEC 14882:2003(C++03)第7.1.5.1/8节“cv限定符”中规定: 注意:易失性是实现的一个暗示,以避免涉及对象的积极优化,因为对象的值可能会因实现的不可检测而改变。< /强>参见详细语义。一般来说,C++中的易失性语义与C++相同。 实施无法检测到的这些“手段”也已成为纳瓦兹问答的主题: 然而,有时,优化(程序的某些部分)可能是不可取的,因为可能是其他人在程序外部更改某些int的值,而编译器不知道,因为它看不到它;但这是你设计它的方式。在这种情况下,编译器的优化将

ISO/IEC 14882:2003(C++03)第7.1.5.1/8节“cv限定符”中规定:

注意:易失性是实现的一个暗示,以避免涉及对象<强>的积极优化,因为对象的值可能会因实现的不可检测而改变。< /强>参见详细语义。一般来说,C++中的易失性语义与C++相同。
实施无法检测到的这些“手段”也已成为纳瓦兹问答的主题:

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

但不幸的是,他没有解释这些“意味着什么”,即可能从程序外部改变对象,以及它们如何改变对象


我的问题:

  • 这些“不可检测手段”的例子有哪些?它们如何能够从程序外部更改程序的内部对象

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

编译器无法检测到这一点

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

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

一个虚构的例子:

int v = 0;

// Some thread
SetUpdatesOn(&v);

 // Another thread
for(;;)
{
   int g = v;
   std::cout << g;
}
intv=0;
//一些线
设置日期(S&v);
//另一根线
对于(;;)
{
int g=v;

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

编译器无法检测到这一点

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

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

一个虚构的例子:

int v = 0;

// Some thread
SetUpdatesOn(&v);

 // Another thread
for(;;)
{
   int g = v;
   std::cout << g;
}
intv=0;
//一些线
设置日期(S&v);
//另一根线
对于(;;)
{
int g=v;

std::cout它可以是一个微控制器的寄存器,连接到一个输入端,由硬件更改的寄存器。由内核中断例程
volatile
更改的变量是为内存映射硬件寄存器设计的。在这种实现中,读取一个特定的内存地址从外部设备获得一个值,然后写入它nds数据到外部设备。从这样一个地址读取的值可能会自动改变,而不被分配到。它可能是一个微控制器的寄存器,连接到一个输入端,由硬件改变的寄存器。由内核中断例程
volatile
改变的变量是为内存映射硬件寄存器设计的。在这样的imp中实现中,读取特定内存地址从外部设备获取一个值,并向其写入数据,从而将数据发送到外部设备。从此类地址读取的值可能会自动更改,而不会被分配到。“…这使得易失性对象适合与信号处理程序通信,但不适合与另一个执行线程通信…”使用线程时,请使用
std::atomic
而不是
volatile
。@RichardCriten此子句不正确。如果有东西在您不知情的情况下修改了您的函数,这可能是在另一个线程中进行的。@MichaelChourdakis@MichaelChourdakis:对于使用与主线程相同的缓存视图的执行上下文,适用于目的是实现定义的。MSVC传统上被视为“易失性”在硬件缓存不会造成问题的情况下,高质量的方式足以满足许多任务。其他一些编译器采取的态度是,该标准没有强制编译器这样做,即使在这样做毫无用处的平台上,这代表了一种判断,即编译器不应该配置为这样做。“…这使得易失性对象适合与信号处理程序通信,但不适合与另一个执行线程通信…”。。。"使用线程时,请使用
std::atomic
而不是
volatile
。@RichardCriten此子句不正确。如果有东西在您不知情的情况下修改了您的函数,这可能是在另一个线程中进行的。@MichaelChourdakis@MichaelChourdakis:对于使用与主线程相同的缓存视图的执行上下文,适用于目的是实现定义的。MSVC传统上被视为“易失性”在硬件缓存不会造成问题的情况下,高质量的方式足以满足许多任务。其他一些编译器采取的态度是,该标准没有强制编译器这样做,即使在这样做毫无用处的平台上,这代表了一种判断,即编译器不应该配置为这样做。