第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

C
函數(shù)式編程 2019-06-25 16:05:39
為什么在C中需要易失性?為什么volatile需要在C區(qū)嗎?它是用來干什么的?它能做什么?
查看完整描述

3 回答

?
aluckdog

TA貢獻1847條經(jīng)驗 獲得超7個贊

易失性告訴編譯器不要優(yōu)化與易失性變量有關(guān)的任何事情。

使用它的原因只有一個:當您與硬件接口時。

假設(shè)您有一小塊硬件被映射到某個地方的RAM中,并且有兩個地址:一個命令端口和一個數(shù)據(jù)端口:

typedef struct{
  int command;
  int data;
  int isbusy;} MyHardwareGadget;

現(xiàn)在您要發(fā)送一些命令:

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;}

看起來很容易,但它可能會失敗,因為編譯器可以自由地更改數(shù)據(jù)和命令的寫入順序。這將導(dǎo)致我們的小工具發(fā)出帶有先前數(shù)據(jù)值的命令。還可以在繁忙的循環(huán)中查看等待。那個會被優(yōu)化的。編譯器將試圖變得聰明,只讀取一次“正忙”的值,然后進入無限循環(huán)。這不是你想要的。

解決這個問題的方法是將指針小工具聲明為易失性的。這樣,編譯器就會被迫執(zhí)行您所寫的操作。它不能刪除內(nèi)存分配,不能在寄存器中緩存變量,也不能更改賦值順序:

這是正確的版本:

   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;
    }


查看完整回答
反對 回復(fù) 2019-06-25
?
瀟湘沐

TA貢獻1816條經(jīng)驗 獲得超6個贊

volatile在C中,實際上是為了不自動緩存變量的值而出現(xiàn)的。它將告訴機器不要緩存這個變量的值。因此,它將取給定的volatile當主內(nèi)存每次遇到它時,它都會發(fā)出來自主內(nèi)存的變量。之所以使用此機制,是因為在任何時候,操作系統(tǒng)或任何中斷都可以修改該值。所以用volatile每次都能幫助我們重新獲得價值。


查看完整回答
反對 回復(fù) 2019-06-25
?
慕勒3428872

TA貢獻1848條經(jīng)驗 獲得超6個贊

volatile在C中,實際上是為了不自動緩存變量的值而出現(xiàn)的。它將告訴機器不要緩存這個變量的值。因此,它將取給定的volatile當主內(nèi)存每次遇到它時,它都會發(fā)出來自主內(nèi)存的變量。之所以使用此機制,是因為在任何時候,操作系統(tǒng)或任何中斷都可以修改該值。所以用volatile每次都能幫助我們重新獲得價值。


查看完整回答
反對 回復(fù) 2019-06-25
  • 3 回答
  • 0 關(guān)注
  • 660 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號