標籤:樣本 turn use 不同類 int fine 另一個 block 無法
內嵌函式是指用inline關鍵字修飾的函數。在類內定義的函數被預設成內嵌函式。
實質
就是當需要調用一個內嵌函式時,不是去調用而是將該函數代碼整段插入到需要使用該內嵌函式的地方,從而省去調用過程,提高了運行速度。
缺點
由於每當代碼調用到內嵌函式,就需要在調用處直接插入一段該函數的代碼,所以程式的體積將會增大,消耗更多空間。
內嵌函式最適用於小函數使用,例如訪問私人資料成員。 這些一行或兩行代碼的“訪問器”函數的主要用途是返回有關對象的狀態資訊;短函數對函數調用的開銷很敏感。 較長的函數在調用/返回序列方面花費的時間可成比例地減少,而從內聯的獲益也會減少。
1 // when_to_use_inline_functions.cpp 2 class Point 3 { 4 public: 5 // Define "accessor" functions as 6 // reference types. 7 unsigned& x(); 8 unsigned& y(); 9 private: 10 unsigned _x; 11 unsigned _y; 12 }; 13 14 inline unsigned& Point::x() 15 { 16 return _x; 17 } 18 inline unsigned& Point::y() 19 { 20 return _y; 21 } 22 int main() 23 { 24 }
假設操作座標是此類用戶端中相對常見的操作,則將兩個訪問器函數(前面樣本中的 x 和 y)指定為“內聯”通常將節省下列操作的開銷:
函數調用(包括參數傳遞和在堆棧上放置對象地址)
保留調用者的堆疊框架
設定新的堆疊框架
傳回值通訊
舊堆疊框架還原
返回
內嵌函式與宏:
雖然內嵌函式類似於宏(因為在編譯時間進行調用會展開函數代碼),但內嵌函式是通過編譯器分析的,而宏是通過前置處理器展開的。 因此,存在很多重大差異:
- 內嵌函式遵循對正常函數強制執行的所有型別安全協議。
- 使用與任何其他函數相同的文法來指定內嵌函式,只不過它們在函式宣告中包含 inline 關鍵字。
- 計算一次作為內嵌函式的參數傳遞的運算式。 在某些情況下,作為宏的參數傳遞的運算式可計算多次。
如果出現以下情況,編譯器無法對函數進行內聯:
使用 /Ob0(調試產生的預設選項)編譯函數或其調用方。
函數和調用方使用不同類型的異常處理(一個中使用 C++ 異常處理,另一個中使用結構化異常處理)。
函數具有變數參數列表。
除非使用 /Og、/Ox、/O1 或 /O2 進行編譯,否則函數使用內聯程式集。
函數是遞迴函式,不附帶 #pragma inline_recursion(on)。 遞迴函式使用雜注內聯為 16 個調用的預設深度。 若要減小內聯深度,請使用 inline_depth 雜注。
函數是虛函數,進行虛擬調用。 對虛函數的直接調用可以進行內聯。
程式採用函數地址,調用通過指向函數的指標進行。 對採用其地址的函數的直接調用可以進行內聯。
函數還使用 naked __declspec 修飾符進行標記。
C++內嵌函式