回覆列表
  • 1 # 使用者693921898468

    volatile相當於告訴編譯器,由它宣告的東西的易變的,不確定的,可能由外部程式(如中斷程式)改變的,禁止編譯器對其讀寫操作進行最佳化,如果定義:

    inti;

    則編譯器可能會將其最佳化,而放到CPU暫存器中,這在多數情況下是好的,然而在有些情況下,我們會要求一些變數必須在記憶體中(如驅動程式,中斷處理程式等等),這時編譯器這個最佳化就是引起問題,為了避免這種情況,應該這樣定義:

    volatileinti;

    PS:volatile通常也用來阻止編譯器具最佳化操作,如你有一個非精確延時函式:

    voiddelay(unsignedinttimeout)

    {

    unsignedinti;

    for(i=0;i<timeout;i++);

    }

    有些編譯會足夠聰明地注意到這個函式本質上是什麼也沒幹,會將針對這個函式的呼叫最佳化掉,但這樣是不對的,所以你應該這麼宣告:

    volatilevoiddelay(...)

    {

    //同上

    }

  • 中秋節和大豐收的關聯?
  • 23了,男生可以學探戈和快步麼?是要去舞蹈教室學麼?有沒有什麼坑?