2010年8月19日 星期四

const 與 volatile 修飾字

const 即是常數,即是宣當時賦值後只能讀取,無法改寫的數,很多初學者只知道這可以宣告無法改變的變數,但又莫名奇妙不知道實質的意義,不要改變這種事不就自己知道就好了嗎?為什麼要刻意在前面加上 const 來修飾呢?小的之前的想法就是這樣,讀的書多了才發現真正的用處在哪。

許多大型的程式並不是自己一個人開發的,常常和同事、同學一起分工,有時後你需要一個功能,於是你寫了函式原型,請同事幫忙開發這個函式,但函式的參數是很大型的資料結構,基於效能考量你必須使用傳址或參考,但傳址或傳參考並不是將物件 copy 一份給 function,而是可以被直接改變,但你又不想讓同事改變到物件的內容,這時後你可以用 const 來修飾參數,例如你給了同事這樣子的函式原型


CString foo(const HugeClass &refData);


如此同事在實作 foo 的內容時,他就沒辦法在 foo 的 block 裡面更改 refData 的任何值,除此之外,宣告變數時也要養成常利用 const 修飾的習慣,這是基於 Refactoring 的觀念,C++ 中用 const 修飾,Java 就用 Final 修飾,const 變數是可以被編譯器檢查的,不像 #define 只在前置處理器被置換,所以也要盡量使用 const 去取代 #define

const 變數往往習慣用大寫來命名,例如


const int MAX_CLIENT_WIDTH = 500;


很多很多…可以慢慢去體會。

volatile 修飾字是比較特殊且有實質用意的修飾字,常常會用在 Singleton 的類別或撰寫 Multi Thread 程式時,變數在被讀取、修改時,常常會被讀進 CPU 暫存區,並直接在 CPU 暫存區做修改,等到一連串的指令做完以後才寫進實體記憶體,如果是單緒的程式是不會發生什麼問題,但若是多緒的程式,若有一個 Thread 改變了某變數,但沒有即時寫進記憶體,另一個 Thread 又去該記憶體位置取用這個變數,這時就會取到舊的資訊,這就不是件好事了,而 volatile 即是在解決這種情況的,宣告變數時在型態前加上 volatile 修飾,程式執行時即會在變數改變時立即寫入記憶體,可以降低上述情況的發生。

沒有留言:

張貼留言