与标题一样 - 是否有volatile
在单线程编程环境中有用的情况?我知道它用于确保变量的值总是在内存中实际检查,因此在任何情况下,该值可能会以app / compiler赢得的方式改变(在ST应用程序中)#39 ;注意?
我将此问题与语言无关,因为我不知道它们之间会有任何影响这个问题答案的差异。但如果有,请告诉我。
编辑:正如我所指出的那样,这个问题与语言无关。我是否特定于C ++(我已经读过C ++版本也存在差异,但我希望它们不足以让这个问题过于宽泛)。
答案 0 :(得分:4)
这是C和C ++的答案
是的!当变量映射到硬件寄存器(例如I / O设备)时。硬件修改寄存器,与应用程序无关。
示例:
extern volatile uint32_t MY_DEVICE_START; // write-only register
extern volatile const uint32_t MY_DEVICE_STATUS; // read-only register
extern volatile uint32_t MY_DEVICE_DATA; // read-write register
...
MY_DEVICE_DATA = 42; // send input to the device
MY_DEVICE_START = 1; // start the device
while (MY_DEVICE_STATUS == 0) {} // busy-wait for the device to finish
int result = MY_DEVICE_DATA; // read output from the device
...
至少在C / C ++中,这是它的主要原因。 Volatile is even not recommended for multi-threaded use。
答案 1 :(得分:3)
其他答案已经解决了volatile
的问题,但是我想提供一个真实世界的示例,用于volatile
有用的时候(不试图读取/写入特殊的硬件内存位置) )。
volatile
在C或C ++程序中有用的一个例子是调试。请考虑以下示例:
void do_thing(const std::vector<int>& v) {
if (v.empty()) {
do_thing_1();
} else {
do_thing_2();
}
}
如果我想测试上面的函数并强制它在调试时使用true或false分支,我可以在if条件中插入volatile
变量:
void do_thing(const std::vector<int>& v) {
volatile bool condition = v.empty();
if (condition) {
do_thing_1();
} else {
do_thing_2();
}
}
我将其设为volatile
,因此优化器不会完全优化变量。这样可以很容易地在if
上设置断点,然后我可以修改condition
(无需修改v
)。
我还可以使condition
成为static
变量,这样我就不必一直打到断点:我可以打一次,设置它,然后它会“记住”我的选择
当然,这是一个黑客,但我发现它在某些特定情况下非常有用。
答案 2 :(得分:1)
单线程程序也可以进行信号处理,甚至可以在非多线程平台上使用硬件中断处理,因此处理函数中修改的非局部变量应声明为volatile
。
P.S。答案或多或少是通用的,可能不正确,这取决于语言,如上所述。