为什么在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;     }

潇湘沐

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

慕勒3428872

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