我目前正在课堂上学习C,而且我对易变变量有一些困惑。我的教科书将它们定义为此。
易变变量
volatile变量是那些随时被其他外部变化的变量 程序或相同的程序。语法如下。
volatile int d;
正常变量和volatile变量之间究竟有什么区别?如果外部程序可以更改volatile变量,如何更改其他外部程序的值。
感谢。
答案 0 :(得分:8)
volatile
表示用于存储对象的字节可以由与程序并行运行的其他东西更改或访问。实际上,这通常是硬件接口,但有时它也用于与操作系统连接。
尽管const
表示内存是只读的(对于您的程序),volatile
表示某些其他任务具有对它的写访问权。 const volatile
一起表示对象表示硬连线输入;你可能会在带有内存映射传感器的微控制器中看到这样的东西。
这对程序的影响是编译器特别处理对内存的访问。如果您访问它两次,编译器将不会缓存第一次访问并为您提供两次相同的值。它将进入内存硬件并执行两次读取操作。当您修改对象时,将立即按照您的指定编写该修改,而不进行缓冲或重新排序优化。
答案 1 :(得分:7)
volatile
关键字告诉编译器可以更改变量(听起来毫无意义),因此您应该在优化时注意。例如,考虑这个 -
bool running = true;
while(running) {
//do something
}
编译器可能会将while(running)
更改为while(1)
,但如果变量running
受到while循环外部代码的影响,就像在多线程中一样,这会产生一个错误很难发现。因此,正确的做法是将running
声明为volatile
。
volatile bool running = true;
while(running) {
//do something
}