每日一C之volatile
每天拾一个C语言贝壳,厚积薄发,积跬步以致千里。
今日贝壳:C语言volatile用于避免因编译器优化导致的错误。
CPU访问内存的速度远快于访问设备地址,访问寄存器速度又快于内存,为了提高程序的运行速度,编译器会对程序进行优化。如:
buffer=Read(0xEE);
//读取0xEE端口数据,存入a
a=buffer;
buffer=Read(0xEE);
//读取0xEE端口数据,存入b
b=buffer;
编译器可能会优化成:
buffer=Read(0xEE);
a=buffer;
b=buffer;
//此次优化能减少一次设备访问
问题:如果0xEE端口内容实时更新,此次优化将会违背程序的初衷, volatile则用于解决此问题,提示编译器不要对次变量进行优化。用法如下:
volatile
buffer=Read(0xEE);
使用场合:volatile用于修饰可能被外界中断修改的变量,或其他线程修改的变量等。
1.中断程序
2.多线程程序
等程序设计中常会使用到volatile。
Have a nice day !
Have a nice day !