- 众所周知,volatile的使用时为了防止编译器对内存优化,确保每次取值时是从内存中取出的,而不是取得寄存器中的备份.
经常用于一下三个地方:①中断服务程序
②多线程共享
③访问并行设备的硬件寄存器.
- 为了方便大家理解,可以看下面的代码:
这个代码能计算除*ptr的平方吗?这实际是一个很容易犯的缺陷,上面代码可以展开为:
你很难保证,a的取值和b的取值是不一样的,正确的写法应该是:
- 大家在使用setjmp和longjmp进行函数间的跳转时,也要学会用volatile,因为在编译优化后不用volatile可能没有起到跳转的作用,可以参考如下结果: