为什么在C语言中需要使用volatile
?它有什么用途?它会做什么?
为什么在C语言中需要使用volatile
?它有什么用途?它会做什么?
Volatile在IT技术中也是非常有用的,特别是当你想要强制编译器不优化某个特定的代码序列(例如编写微基准测试)时。
volatile
语义时应该有所区别。不幸的是,由于标准未建议针对低级编程意图的优质编译器应该如何处理volatile
,以便识别特定读/写操作对该平台上的任何相关影响,许多编译器在这方面做得不够好,使得处理像后台I/O这样的事情变得更加困难,即使是高效的处理方式也可能被编译器的“优化”破坏。易变意味着存储很可能随时发生变化,并且受用户程序控制之外的因素影响。
这意味着如果引用这个变量,程序应该始终检查物理地址(即,一个映射输入FIFO),而不是以缓存方式使用它。
简单来说,它告诉编译器不要对特定变量进行任何优化。映射到设备寄存器的变量是由设备间接修改的。在这种情况下,必须使用volatile。
正如许多人在这里正确建议的那样,volatile关键字的流行用途是跳过volatile变量的优化。
在阅读了有关volatile的内容后,最值得一提的最大优点是--防止在longjmp
(非局部跳转)的情况下回滚变量。
这是什么意思?
这意味着在您执行堆栈展开以返回到某个先前的堆栈帧时,将保留最后一个值;通常在某些错误情况下。
由于这超出了本问题的范围,我不会在此详细介绍setjmp/longjmp
,但值得阅读它;以及如何使用volatile功能来保留最后一个值。