Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

Anonymous
Anonymous asked in 電腦與網際網路程式設計 · 2 decades ago

volatile關鍵字的用法

請問高手

C關鍵字volatile

是否可以說明一下,如何用

最好舉個例子

3 Answers

Rating
  • Lv 7
    2 decades ago
    Favorite Answer

    C關鍵字volatile可以講是善變的. 也就是說因為它善變所以當C接觸它時會直接到它的記憶體裡讀取或儲存. 而不會經過第三者. 一般volatile出現在multi-threaded或有signal handler的程式裡. 在compile程式的時候. 絕大多數的compiler在把程式轉成機器語言時會自行改變程式使程式的運作更加迅速. 比如說以下的程式

    int hello;

    void foo()

    {

    hello = 1;

    printf(“%d\n”, hello);

    }

    在compiler在把函式轉成機器語言時會把hello裡的值存入registry(第三者)裡然後所有有關hello的運算都在registry裡發生. 到函式結束時才把registry裡的值存入hello裡.因為在registry裡運算比在記憶體裡運算還要快多了. 如果”int hello”改成”volatile int hello”, 那每一次要用到hello時會到hello裡讀取它的數. 每一次要存數進到hello時會馬上存入hello裡. 這樣就沒有registry這樣的中間人(第三者). 但也慢了許多.

    假如說:

    #include <io.h>

    #include <signal.h>

    #include <stdio.h>

    #include <string.h>

    void sig_handler(int);

    static int stepnum;

    int main()

    {

    stepnum = 0;

    signal(SIGKILL, sig_handler);

    /* code omitted - does not use stepnum */

    stepnum = 1;

    /* code omitted - does not use stepnum */

    stepnum = 2;

    return 0;

    }

    void sig_handler(int x)

    {

    char FileData[50];

    sprintf(FileData, "Error at Step %d\n\r", stepnum);

    write (2, FileData, strlen(fileData));

    }

    當以上的程式執行到main時, 它會先把stepnum的值存進一個registry裡之後用那個registry來運算. 所以當執行到stepnum = 1;時, 真正的stepnum的值是0. 我們是只換registry裡的值.假如使用者執行完stepnum = 1;時按CTRL+C. 因為我們有signal handler,所以程式暫時轉到sig_handle來執行.因stepnum不是volatile. 所以當顯示stepnum裡的值時會顯示出0.

    如果stepnum是volatile,那在當執行到stepnum = 1;時會改真正stepnum的值. 所以在sig_handle顯示stepnum裡的值時會顯示出1.

    懂不懂? 不懂請再問

    用這程式也可以. 要記得在compile時要選Maximize Speed才行(Alt+F7, C/C++, Optimizations:, Maximize Speed.)

    #include <stdio.h>

    #include <stdlib.h>

    #include <signal.h>

    int step = 0;

    void signal_handler(int);

    int main() {

    signal(SIGINT, signal_handler);

    step = 1;

    while (1);

    step = 2;

    step = 3;

    return(0);

    }

    void signal_handler(int signal)

    {

    printf("at %d step\n", step);

    }

  • 7 years ago

    最近發現一家很不錯的a片專賣店唷,

    網址先貼給你 http://xor.tw/4z9kn

    它出的新片速度很快喔~每個禮拜都有很多新片

    新片價格一片是30元而已,我看過還很清晰的,

    有瑕疵片可以跟客服反應,他們會協助處理唷

    如果你要畫質更好的,也有藍光dvd,超*的

    不知道怎麼挑片的話,也有站長推薦的精選套餐

    http://xor.tw/4nqjk

    自己買很多了才推薦給你唷!!看看吧

    #@#

    推薦你這間線上A片即時觀看喔!!

    A片種類超多的,我常去光顧呢

    保證你不會後悔的啦~

    號稱業界最強,怎麼可以錯過呢

    30點現上儲值可以馬上觀看,省去等宅配時間

    http://xor.tw/4nz0x

  • 1 decade ago

    如你所提的

    在multi-threaded或有signal handler的程式裡常出現

    volatile

    這是絕對的嘛?

    我要如何確定compiler已經把我的變數放到registry了呢?

    除了去看assembly之外,有什麼判斷的準則嗎?

    感謝!!!

Still have questions? Get your answers by asking now.