C++的inline, extern, static關鍵字
撰寫時間 : 2021/09/29
inline(內嵌函數)
介紹
一般呼叫函數,電腦的機器語言指令會紀錄目前工作階段的記憶體位址,然後跳至函數的記憶體位置處理完程序後,並回到原先的位址上,而這樣來回會造成時間上的額外負擔。
C++
於是提供這種內嵌函數,當我們加入關鍵字時,在編譯時便會把函數中的程式直接展開。
注意
- 即便加入inline想要使用內嵌函數,編譯時也不一定就會實作,視編譯器優化而定。
- 類中定義的所有函數都是隱式內聯的,但最好的寫法還是類內寫原型,類外函數指定為
inline
與C的macro展開差異
macro由預處理器管理,內聯函數由C++
編譯器管理。而macro無法訪問類內私有成員。
extern
介紹
- 聲明extern關鍵字的全局變量和函數可以使得它們能夠跨文件被訪問。
extern "C"
C++
支援函數重載,而C
則不支援。函數被C++
編譯後在符號庫中的名字與C語言的不同,因此使用extern "C"{}
,可以讓C++
在引用C
時不會多加處理(mangled name
),而能正常使用。
static
介紹
- 兩個 compile 後的 .o 檔在 link 的過程中就會因為名字相同而產生衝突的錯誤。對不存在在 funciton 外的變數來說,基本上都是 global variable,static 的用意就是要讓這樣的 global 只限定在該檔案內,而不是整個程式中。
- static 出現在 class 的 member variable 的意思是該 variable 並不屬於某個 instance,他屬於這個 class,所有以此 class 生成出來的 instance 都共用這個 variable。
參考資料