網際網路面試經典 -C/C++關鍵字
register:
register關鍵字的作用:
請求CPU儘可能讓變數的值儲存在CPU內部的暫存器中,減去CPU從記憶體中抓取資料的時間,提高程式執行效率。
register作用的實現原理:
擴充套件:CPU組成,計算機系統組成,資料處理流程
什麼時候使用register?
一般,我們將頻繁被訪問的變數,用register修飾
(因為CPU記憶體資源是有限的,是稀缺的,不可能將所有變數都宣告為register變數)
使用register關鍵字應注意什麼?
1.只有區域性變數才可以被宣告用register修飾
(register不能修飾全域性變數和函式的原因:全域性變數可能被多個程序訪問,而用register修飾的變數,只能被當前程序訪問)
2.不能用取地址獲取用register修飾的變數的地址(原因:變數儲存在暫存器中,而取地址獲取的地址的是記憶體的地址)
3. 用register修飾的變數一定要是CPU所接受的資料型別
Static:
Static關鍵字的作用:
Static既可以修飾變數,也可以修飾函式,修飾變數時,既可以修飾區域性,也可修飾全域性。
Static修飾靜態區域性變數,延長變數的生命週期,直至程式結束,這個變數才釋放。
Static修飾全域性變數,使其只可在本檔案可訪問,其他檔案不可見。
(Static修飾的變數都儲存在資料段靜態資料區中,未初始化時,系統將預設初始化為0)
Static修飾函式,使其只可在本檔案可呼叫,其他檔案不可呼叫
什麼時候使用static修飾變數
當希望一個變數直至程式結束才釋放時,用Static修飾靜態區域性變數。
當希望一個全域性變數只可在本檔案可訪問,其他檔案不可見時,用Static修飾全域性變數。
當希望一個函式只可在本檔案可呼叫,其他檔案不可呼叫時,用Static修飾函式。
extern:
extern關鍵字的作用:
extern用來外部宣告一個全域性變數,這個全域性變數在另一個檔案中被定義
使用extern關鍵字應注意什麼?
標明資料型別 例:extern intcount;
什麼時候使用extern修飾變數
在a.c中想使用b.c的全域性變數用extern 外部宣告
const:
const關鍵字的作用:
const修飾變數,是這個變數變成只讀變數,變數對應的空間的值是可變的,但不能用變數名來修改空間中的值。
const修飾指標。
使用const關鍵字應注意什麼?
使用const關鍵字修飾的變數,一定要對變數進行初始化
int *const p = # p++ ✘
const int *p = # (*p)++ ✘
int const *p = # (*p)++ ✘
(離誰進,誰就不可以改變)
什麼時候使用const修飾變數?
函式形參用const修飾,防止函式實現過程中,修改了實參的值。
typedef:
typedef關鍵字的作用:
給資料型別定義一個新名字,
1. 提高了移植性
2. 簡化複雜的型別宣告,提高編碼效率
3. 解釋資料型別的作用
voliate:
voliate關鍵字的作用:
當要求使用volatile宣告變數值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。精確地說就是,遇到這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問;如果不使用valatile,則編譯器將對所宣告的語句進行優化。(簡潔的說就是:volatile關鍵詞 保證記憶體可見性,避免程式碼被優化,使變數每次取值都在記憶體中進行)。
一般來說,volatile關鍵字用在如下的幾個地方:
1、中斷服務程式中修改的供其他程式檢測的變數需要加volatile;2、多工環境下各任務間共享的標誌應該加volatile;3、儲存器對映的硬體暫存器通常也要加volatile說明,因此每次對它的讀寫都可能有不同意義。Inline:
inline關鍵字的作用:
內聯inline是給編譯器的優化提示,如果一個函式被編譯成inline的話,那麼就會把函式裡面的程式碼直接插入到呼叫這個函式的地方,而不是用呼叫函式的形式。
使用inline關鍵字應注意什麼?
內聯是以程式碼膨脹(複製)為代價,僅僅省去了函式呼叫的開銷,從而提高函式的執行效率。如果執行函式體內程式碼的時間,相比於函式呼叫的開銷較大,那麼效率的收穫會很少。另一方面,每一處行內函數的呼叫都要複製程式碼,將使程式的總程式碼量增大,消耗更多的記憶體空間。