可別總結 C++ 開發面試問題了
今天@吉林小夥 發了個截圖,來自於知乎使用者 的
ofollow,noindex" target="_blank">Jerish:史上最全的C++/遊戲開發面試問題總結(一)——C++基礎問:inline的優劣(提問概率:★★)
優點:減少函式呼叫開銷
缺點:增加函式體積,exe太大,佔用CPU資源,可導致cache裝不下(減小了cache的命中) ,不方便除錯debug下一般不內聯, 每次修改會重新編譯標頭檔案增加編譯時間
注意:inline只是一個請求,編譯器有權利拒絕。有7種情況下都會拒絕,虛呼叫,體積過大,有遞迴,可變數目引數,通過函式指標呼叫,呼叫者異常型別不同,declspec巨集等
forceinline字面意思上是強制內聯,一般可能只是對程式碼體積不做限制了,但是對於上面的那些情況仍然不會內聯,如果沒有內聯他會返回一個警告。 建構函式解構函式不建議內聯,裡面可能會有編譯器優化後新增的內容,比如說初始化列表裡面的東西。
- inline 的優點絕對不止減少函式呼叫開銷這麼簡單。我認為最大的好處是內聯後編譯器可以知道更多的資訊從而進行更多的優化,C++、Rust 的 zero-overhead abstraction 都很大程度上依賴內聯,例如 map().filter() 優化成裸迴圈,可以參考:看看所謂的 Zero cost abstraction ,這裡不再贅述。
- 現代編譯器(或者說連結器?)都裝備了 LTO,連結時也可以內聯。也就是說,我把定義寫在 cpp 裡也可以在連結的時候內聯,那麼 “每次修改會重新編譯標頭檔案增加編譯時間 ”這條實際上也是錯的。
- 編譯器會拒絕全部的虛呼叫也是錯的,可以看這裡,其中 Fuck 是虛擬函式,但是編譯器還是內聯了。devirtualization 瞭解一下: http:// blog.llvm.org/2017/03/d evirtualization-in-llvm-and-clang.html
- 至於
建構函式解構函式不建議內聯,裡面可能會有編譯器優化後新增的內容,比如說初始化列表裡面的東西。
我感覺已經不知所云了。建議觀看 https://www. youtube.com/watch? v=Qq_WaiwzOtI 。