2016年12月8日 星期四

[C] const volatile

http://stackoverflow.com/a/4597164 給了一個不錯的解釋。

以下是回答所提供的例子:

unsigned int const volatile *status_reg; // assume these are assigned to point to the 
unsigned char const volatile *recv_reg;  //   correct hardware addresses


#define UART_CHAR_READY 0x00000001

int get_next_char()
{
    while ((*status_reg & UART_CHAR_READY) == 0) {
        // do nothing but spin
    }

    return *recv_reg;
}

因為不希望這支程式改動到 status_reg 跟 recv_reg 指到的值,所以把他們設定為 const。

但並不表示其他程序不會動到 status_reg 跟 recv_reg 所指到的值,以這個例子來說就是硬體會改變那兩個記憶體位置的值。

如果 compiler 在這支程式做最佳化的話,那 while 迴圈可能就只會讀取 status_reg 一次,那就有可能面臨到無窮迴圈跳不出來的問題,所以只好把他們設定為 volatile,叫 compiler 不要偷懶,每次乖乖的去取值。


https://read01.com/oONo5Q.html 提到的一些觀念釐清:


  • const: 含意是「請做為常數使用,這個值只能讀不能寫」,而並非「這個值只是個常數而他不會變」
  • volatile: 含意是「請不要做最佳化,因為這個值可能會變」,而並非「你可以修改這個值」


所以其實 const 跟 volatile 是不矛盾的。


勉強になった。

沒有留言:

張貼留言