在C++编程中,很少会用到volatile变量,所以很多人并不清楚volatile变量的意义。其实volatile关键字是用于告诉编译器,它所声明的变量的内存位置是一块特殊内存,而非普通内存。
而何为普通内存呢?让我们来看一下以下代码:
int x = 10;
int y = x;
y = x;
对于以上代码,其实第二次”y = x;”的调用是多余,编译器实际上很有可能会将这段代码进行优化,优化后可能的情况就是:
int x = 10;
auto y = x;
第二次对y的赋值直接删除了,因为这是没有意义的。
而对于以下代码:
x = 10;
x = 20;
对x的第一次赋值后,紧接着又对x进行重新赋值。因此第一次赋值就是不必要的,因为它在使用前又被重新赋值了。所以编译器会就将第一次赋值优化掉,只留下20那次赋值。
但假如x是volatile变量,那编译器则不会进行这样的优化,因为volatile变量意味着它是一块特殊的内存,它有可能不是指RAM的某个地址,而是对应了某个外接设备的端口,其中最常见的是memory mapped I/O。这是对y的两次赋值的意义就不同了,第二次赋值就相当于第二次读取,这是读到的结果有可能与第一次读取时不一致的;而后续对x的两次赋值也都有了特殊的意义。因此,编译器便需要对它进行特殊的对待,而不能直接优化掉第二次的赋值。
总之而言,volatile关键字就是告诉编译器,这里处理的不是普通内存,不要对这个变量使用任何的优化。所以当我们处理类似于memory mapped I/O时,我们就应该使用volatile声明,以避免编译器的优化所带来的错误。