亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在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 關注
  • 668 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號