volatile有什么作用

volatile是C++中的一个关键字,它告诉编译器对象的值可能会以程序未明确指示的方式被改变。这通常发生在以下几种情况:

  1. 硬件寄存器:例如,一个状态寄存器,它的值可能会在任何时间被硬件改变。
  2. 中断服务程序:一个在主程序中定义的变量可能会被一个中断服务程序改变。
  3. 多线程:一个在主线程中定义的变量可能会被其他线程改变。

在默认情况下,编译器会对程序进行优化,以提高程序的运行效率。这些优化可能包括:缓存变量的值,删除未使用的变量,重新排序无关的指令等。然而,如果一个变量被声明为volatile,那么编译器就不能对这个变量进行这些优化。每次访问volatile变量时,都会直接从它的内存地址中读取值,而不是从寄存器或其他地方读取可能的缓存值。

这里有一个例子:

volatile int timer; // 假设这个变量会被硬件定时器改变

void wait_for_timer() {
    int start = timer;
    while (timer == start) {
        // 等待定时器改变
    }
}

在这个例子中,如果timer没有被声明为volatile,那么编译器可能会认为在while循环中timer的值没有被改变,所以它会将timer的值缓存起来,导致程序进入无限循环。如果timer被声明为volatile,那么编译器就会知道timer的值可能会被改变,所以它每次都会从内存中读取timer的值,而不是使用缓存值,这样程序就能正确地等待定时器改变。

发表评论

后才能评论