const和volatile的區別

一.關鍵字const有什麼含意?程序員

       只要一聽到說:「const意味着常數」,就知道我正在和一個業餘者打交道。去年Dan Saks已經在他的文章裏徹底歸納了const的全部用法,所以ESP(譯者:Embedded Systems Programming)的每一位讀者應該很是熟悉const能作什麼和不能作什麼.若是你從沒有讀到那篇文章,只要能說出const意味着「只讀」就能夠了。儘管這個答案不是徹底的答案,但我接受它做爲一個正確的答案。(若是你想知道更詳細的答案,仔細讀一下Saks的文章吧。)
若是應試者能正確回答這個問題,我將問他一個附加的問題:
下面的聲明都是什麼意思?

const int a;
int const a;
const int *a;
int * const a;
int const * const a ;優化

前兩個的做用是同樣,a是一個常整型數。第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針能夠)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是能夠修改的,但指針是不可修改的)。最後一個意味着a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。若是應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即便不用關鍵字 const,也仍是能很容易寫出功能正確的程序,那麼我爲何還要如此看重關鍵字const呢?我也以下的幾下理由:
?; 關鍵字const的做用是爲給讀你代碼的人傳達很是有用的信息,實際上,聲明一個參數爲常量是爲了告訴了用戶這個參數的應用目的。若是你曾花不少時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(固然,懂得用const的程序員不多會留下的垃圾讓別人來清理的。)
?; 經過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。
?; 合理地使用關鍵字const可使編譯器很天然地保護那些不但願被改變的參數,防止其被無心的代碼修改。簡而言之,這樣能夠減小bug的出現。spa

二,volatile 指針

volatile影響編譯器編譯的結果,指volatile 變量是隨時可能發生變化的,與volatile變量有關的運算,不要進行編譯優化,以避免出錯,(VC++ 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變量有關的運算,將不進行編譯優化。)。編譯器

例如: 
volatile int i=10; 
int j = i; 
... 
int k = i; 
編譯

volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的地址中讀取,於是編譯器生成的可執行碼會從新從i的地址讀取數據放在k中。而優化作法是,因爲編譯器發現兩次從i讀數據的代碼之間的代碼沒有對i進行過操做,它會自動把上次讀的數據放在k中。而不是從新從i裏面讀。這樣一來,若是i是一個寄存器變量或者表示一個端口數據就容易出錯,因此說volatile能夠保證對特殊地址的穩定訪問,不會出錯。 
變量

相關文章
相關標籤/搜索