c语言类型限定符-关键字。
volatile限定符告诉计算机,可以更改变量值的是代理,而不是变量所在的程序。通常,它用于硬件地址,并在同时运行的其他程序或线程中共享数据。地址用于接受来自另一台计算机的输入信息。
Volatile涉及编译器优化。
编译器注意到代码使用了x两次,但是没有改变它的值。因此,编译器将x的值临时存储在寄存器中,然后在使用时从寄存器中读取x的值。这个过程叫做缓存。没有volatile关键字,编译器不知道这是否会发生。因此,编译器不会缓存。如果代码中没有声明volatile关键字,编译器会假设变量的值在使用过程中没有变化,然后尝试优化代码。
以上是C入门Plus的讲解。
volatile关键字和const一样,是一个类型修饰符,它所修改的变量可以被编译器未知的一些因素改变,比如操作系统、硬件或其他线程。当遇到此关键字声明的变量时,编译器将不再优化访问该变量的代码,从而提供对特殊地址的稳定访问。
先看下面的例子:
int i=10
int j=I;//(1)语句。
int k=I;//(2)语句。
此时,编译器优化了代码,因为我没有在语句(1)和(2)中用作左值。此时编译器认为I的值没有改变,所以在语句(1)中从内存中取出I的值并赋值给J后,这个值并没有被扔掉,而是继续用于在语句(2)中赋值给K。编译器不会生成汇编代码,也不会再次从内存中检索I的值,提高了效率。但注意:(1)、(2)语句之间的I不作为左值。
再看一个例子:
volatile int i=10
int j=I;//(3)语句。
int k=I;//(4)语句。
volatile关键字告诉编译器我随时都可能改变,每次使用I的值都必须从内存中取出,所以编译器生成的汇编代码会从I的地址中重新读取数据,放入k中。
volatile关键字告诉编译器我随时都可能改变,每次使用I的值都必须从内存中取出,所以编译器生成的汇编代码会从I的地址中重新读取数据,放入k中。
这样,如果I是一个寄存器变量或者代表一个端口的数据或者多线程的共享数据,就很容易出错,所以volatile可以保证对特殊地址的稳定访问。
至于为什么容易出错,先记住怎么用,然后填坑。
作者:四月黄妙芝。
来源:https://www.cnblogs.com/hanoch-HMZ/p/15493017.html
本文版权归作者和博主园区所有,仅供学习使用。欢迎转载讨论。但是,未经作者同意,您必须保留此声明,并在文章页面的明显位置给出原文的链接。否则,您保留追究法律责任的权利。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/62061.html