为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在C中需要易失性?

为什么在C中需要易失性?

C
函数式编程 2019-06-25 16:05:39
为什么在C中需要易失性?为什么volatile需要在C区吗?它是用来干什么的?它能做什么?
查看完整描述

3 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

易失性告诉编译器不要优化与易失性变量有关的任何事情。

使用它的原因只有一个:当您与硬件接口时。

假设您有一小块硬件被映射到某个地方的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;
    }


查看完整回答
反对 回复 2019-06-25
?
潇湘沐

TA贡献1816条经验 获得超6个赞

volatile在C中,实际上是为了不自动缓存变量的值而出现的。它将告诉机器不要缓存这个变量的值。因此,它将取给定的volatile当主内存每次遇到它时,它都会发出来自主内存的变量。之所以使用此机制,是因为在任何时候,操作系统或任何中断都可以修改该值。所以用volatile每次都能帮助我们重新获得价值。


查看完整回答
反对 回复 2019-06-25
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

volatile在C中,实际上是为了不自动缓存变量的值而出现的。它将告诉机器不要缓存这个变量的值。因此,它将取给定的volatile当主内存每次遇到它时,它都会发出来自主内存的变量。之所以使用此机制,是因为在任何时候,操作系统或任何中断都可以修改该值。所以用volatile每次都能帮助我们重新获得价值。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 635 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信