關於行內函數的幾點總結以及構造析構是否可以是inline的
為什麼要引入行內函數(行內函數的作用)
用它替代巨集定義,消除巨集定義的缺點。巨集定義使用前處理器實現,做一些簡單的字元替換因此不能進行引數有效性的檢測。另外它的返回值不能被強制轉換為可轉換的合適型別,且C++中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能用巨集定義來操作。
1、行內函數與巨集定義的區別:
- 行內函數在編譯時展開,可以做一些型別檢測處理。巨集在預編譯時展開;行內函數直接嵌入到目的碼中,巨集是簡單的做文字替換。
- C++中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能用巨集定義來操作
2、inline相比巨集定義有哪些優越處
(1)inline函式程式碼是被放到符號表中,使用時像巨集一樣展開,沒有呼叫的開銷效率很高;
(2)inline函式是真正的函式,所以要進行一系列的資料型別檢查;
(3)inline函式作為類的成員函式,可以使用類的保護成員及私有成員;
3、為什麼不能把所有的函式寫成inline函式
行內函數以程式碼複雜為代價,它以省去函式呼叫的開銷來提高執行效率。所以一方面如果行內函數體內程式碼執行時間相比函式呼叫開銷較大沒有太大的意義;另一方面每一處行內函數的呼叫都要複製程式碼,消耗更多的記憶體空間,因此以下情況不宜使用行內函數。
(1)函式體內的程式碼比較長,將導致記憶體消耗代價;
(2)函式體內有迴圈,函式執行時間要比函式呼叫開銷大;
另外兩點需要注意:
行內函數時無法獲取其地址的。
行內函數不可以做為虛擬函式(行內函數,建構函式,靜態函式時都不能為虛擬函式的)
所以要講inline的作用,可以從兩方面考慮:
- 相比普通函式的效率
- 相比巨集定義
另外我們再來說一點,類中的建構函式和解構函式可以是內聯的嗎?
答案是你當然可以將其宣告為內聯的,因為你有權利向編譯器建議任何函式為內聯的。哈哈,當然我們應該換一種問法,類中的建構函式和解構函式適合作為行內函數嗎?effective裡面說,建構函式和解構函式往往是inlining的糟糕候選人。因為編譯器在編譯期間會給你的建構函式和解構函式額外加入很多的程式碼,像成員函式的構造析構等程式碼,所以通常構造解構函式比表面上看起來的要多,並不適合作為行內函數。
inline很重要的一個缺點是:inline造成程式碼膨脹會導致額外的換頁行為,降低指令快取記憶體裝置的命中率,以及伴隨這些而來的效率降低。