猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
为什么在C中需要易失性?
为什么在C中需要易失性?
为什么
volatile
需要在C区吗?它是用来干什么的?它能做什么?
函数式编程
浏览 636
回答 3
3回答
aluckdog
易失性告诉编译器不要优化与易失性变量有关的任何事情。使用它的原因只有一个:当您与硬件接口时。假设您有一小块硬件被映射到某个地方的RAM中,并且有两个地址:一个命令端口和一个数据端口:typedef struct{ int command; int data; int isbusy;} MyHardwareGadget;现在您要发送一些命令:void SendCommand (MyHardwareGadget * gadget, int command, int data){ // wait while the gadget is busy: while (gadget->isbusy) { // do nothing here. } // set data first: gadget->data = data; // writing the command starts the action: gadget->command = command;}看起来很容易,但它可能会失败,因为编译器可以自由地更改数据和命令的写入顺序。这将导致我们的小工具发出带有先前数据值的命令。还可以在繁忙的循环中查看等待。那个会被优化的。编译器将试图变得聪明,只读取一次“正忙”的值,然后进入无限循环。这不是你想要的。解决这个问题的方法是将指针小工具声明为易失性的。这样,编译器就会被迫执行您所写的操作。它不能删除内存分配,不能在寄存器中缓存变量,也不能更改赋值顺序:这是正确的版本: void SendCommand (volatile MyHardwareGadget * gadget, int command, int data) { // wait while the gadget is busy: while (gadget->isbusy) { // do nothing here. } // set data first: gadget->data = data; // writing the command starts the action: gadget->command = command; }
0
0
0
潇湘沐
volatile在C中,实际上是为了不自动缓存变量的值而出现的。它将告诉机器不要缓存这个变量的值。因此,它将取给定的volatile当主内存每次遇到它时,它都会发出来自主内存的变量。之所以使用此机制,是因为在任何时候,操作系统或任何中断都可以修改该值。所以用volatile每次都能帮助我们重新获得价值。
0
0
0
慕勒3428872
volatile在C中,实际上是为了不自动缓存变量的值而出现的。它将告诉机器不要缓存这个变量的值。因此,它将取给定的volatile当主内存每次遇到它时,它都会发出来自主内存的变量。之所以使用此机制,是因为在任何时候,操作系统或任何中断都可以修改该值。所以用volatile每次都能帮助我们重新获得价值。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
C
typedef入门问题
1 回答
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续