1. inline 和 宏定義的區別
inline函數是C++引入的機制,目的是解決使用宏定義的一些缺點。
1.為什麼要引入內聯函數(內聯函數的作用)
用它替代宏定義,消除宏定義的缺點。宏定義使用預處理器實現,做一些簡單的字元替換因此不能進行參數有效性的檢測。另外它的返回值不能被強制轉換為可轉換的合適類型,且C++中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能用宏定義來操作。
2.inline相比宏定義有哪些優越處
(1)inline函數代碼是被放到符號表中,使用時像宏一樣展開,沒有調用的開銷效率很高;
(2)inline函數是真正的函數,所以要進行一系列的數據類型檢查;
(3)inline函數作為類的成員函數,可以使用類的保護成員及私有成員;
3.inline函數使用的場合
(1)使用宏定義的地方都可以使用inline函數;
(2)作為類成員介面函數來讀寫類的私有成員或者保護成員;
4.為什麼不能把所有的函數寫成inline函數
內聯函數以代碼復雜為代價,它以省去函數調用的開銷來提高執行效率。所以一方面如果內聯函數體內代碼執行時間相比函數調用開銷較大沒有太大的意義;另一方面每一處內聯函數的調用都要復制代碼,消耗更多的內存空間,因此以下情況不宜使用內聯函數。
(1)函數體內的代碼比較長,將導致內存消耗代價;
(2)函數體內有循環,函數執行時間要比函數調用開銷大;
另外類的構造與析構函數不要寫成內聯函數。
5.內聯函數與宏定義區別
(1)內聯函數在編譯時展開,宏在預編譯時展開;
(2)內聯函數直接嵌入到目標代碼中,宏是簡單的做文本替換;
(3)內聯函數有類型檢測、語法判斷等功能,而宏沒有;
(4)inline函數是函數,宏不是;
(5)宏定義時要注意書寫(參數要括起來)否則容易出現歧義,內聯函數不會產生歧義;