__inline
關鍵字建議編譯器在合理的情況下內聯編譯 C 或 C++ 函數。
__inline
語義與 C++ inline 關鍵字的語義完全相同。
__inline
是一個存儲類限定符。 它不影響函數的類型。
格式:
inline _declarator;
__inline _declarator; // Microsoft相關
__forceinline _declarator; // Microsoft相關
__inline與inline等同。inline和__inline通知編譯器將該函數的內容拷貝一份放在調用函數的地方,這稱之為內聯。內聯減少了函數調用的開銷,但卻增加了代碼量。__forceinline關鍵字則是不基於編譯器的性能和優化分析而依賴於程序員的判斷進行內聯,但它也不保證一定內斂,有些情況函數是肯定不能內斂的。要慎用__forceinline,不加考慮的使用它將會造成代碼量的膨脹而只得到很小的性能回報,甚至造成性能下降。
1.當使用/clr編譯器選項時,如果函數使用了安全屬性,則不會進行內聯。
2.inline關鍵字僅用於C++;__inline和__forceinline在C和C++中都可用。
3.類的成員函數如果是在類定義的同時定義的,那么它默認是inline的,否則也可以使用inline指定為內聯的。
4.如果函數使用了__forceinline關鍵字,但實際沒有進行內聯,將給出level 1警告。
在以下情況中,編譯器不進行函數內聯,即使是使用__forceinline:
1.函數或其調用者使用/Ob0編譯器選項進行編譯(Debug模式下的默認選項)。也就是說在Debug模式下,是不會發生函數內聯的。
2.函數和其調用者使用不同類型的異常處理。
3.函數具有可變數目的參數。
4.函數使用了在線匯編(即直接在你C/C++代碼里加入匯編語言代碼)。但使用了編譯器關於優化的選項/Og,/Ox,/O1,或/O2的情況除外。
5.是虛函數並且是虛調用。但對虛函數的直接調用可以inline。
6.通過指向該函數的函數指針進行調用。
7.函數被關鍵字__declspec(naked)修飾。