volatile有什么作用
volatile
是C++中的一个关键字,它告诉编译器对象的值可能会以程序未明确指示的方式被改变。这通常发生在以下几种情况:
- 硬件寄存器:例如,一个状态寄存器,它的值可能会在任何时间被硬件改变。
- 中断服务程序:一个在主程序中定义的变量可能会被一个中断服务程序改变。
- 多线程:一个在主线程中定义的变量可能会被其他线程改变。
在默认情况下,编译器会对程序进行优化,以提高程序的运行效率。这些优化可能包括:缓存变量的值,删除未使用的变量,重新排序无关的指令等。然而,如果一个变量被声明为volatile
,那么编译器就不能对这个变量进行这些优化。每次访问volatile
变量时,都会直接从它的内存地址中读取值,而不是从寄存器或其他地方读取可能的缓存值。
这里有一个例子:
volatile int timer; // 假设这个变量会被硬件定时器改变
void wait_for_timer() {
int start = timer;
while (timer == start) {
// 等待定时器改变
}
}
在这个例子中,如果timer
没有被声明为volatile
,那么编译器可能会认为在while
循环中timer
的值没有被改变,所以它会将timer
的值缓存起来,导致程序进入无限循环。如果timer
被声明为volatile
,那么编译器就会知道timer
的值可能会被改变,所以它每次都会从内存中读取timer
的值,而不是使用缓存值,这样程序就能正确地等待定时器改变。