您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“C++的內聯函數怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++的內聯函數怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
C++中的const常量可以替代宏常數定義,如︰
但是C++中是否有解決方替代宏代碼片段呢?這里就要引入內聯函數。
C++中推薦使用內聯函數替代宏代碼片段
C++中使用 inline 關鍵字聲明內聯函數
內聯函數聲明時inline關鍵字必須和函數定義結合在一起,否則編譯器會直接忽略內聯請求
C++編譯器可以將一個函數進行內聯編譯
被C++編譯器內聯編譯的函數叫做內聯函數
C++編譯器直接將函數體插入函數調用的地方
內聯函數沒有普通函數調用時的額外開銷(壓棧,跳轉,返回)
C++編譯器不一定滿足函數的內聯請求
下面先看一段宏定義的代碼:
#include <stdio.h> #define FUNC(a, b) ((a) < (b) ? (a) : (b)) inline int func(int a, int b) { return a < b ? a : b; } int main(int argc, char *argv[]) { int a = 1; int b = 3; int c = FUNC(++a, b); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; }
下面為輸出結果,c =FUNC(++a, b),等價于 c =((++a) < (b) ? (++a) : (b)),先執行(++a) < (b),得到 a =,2,b = 3,由于 ++a 比 b 小,所以輸出 ++a,這個時候 a = 3,所以 c 也等于 3。
如果使用內聯函數,
#include <stdio.h> #define FUNC(a, b) ((a) < (b) ? (a) : (b)) inline int func(int a, int b) { return a < b ? a : b; } int main(int argc, char *argv[]) { int a = 1; int b = 3; int c = func(++a, b); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); return 0; }
輸出結果如下:
下面在 VS2012 中看一下反匯編的代碼,看一看內聯有沒有成功。可以看到 func 函數被調用,而不是直接擴展到被調用的地方,內聯沒有成功。inline 這個關鍵字僅僅是請求將函數內聯,但是不一定會成功。
為了讓編譯器允許對內聯的請求,可以對編譯器進行一些配置,如下圖
配置好以后,在 int c = func(++a, b); 前面打個斷點,開始跑代碼,但是我跑的時候報錯了。
這個時候,進行下面配置,那個錯誤就解決了。
這個時候在進行反匯編,如下圖所示,可以看到調用函數的匯編代碼沒有了,表示內聯成功了。
內聯函數具有普通函數的特征(參數檢查,返回類型等)
函數的內聯請求可能被編譯器拒絕
函數被內聯編譯后,函數體直接擴展到調用的地方
宏代碼片段由預處理器處理,進行簡單的文本替換,沒有任何編譯過程,因此可能出現副作用。
現代C++編譯器能夠進行編譯優化,一些函數即使沒有inline聲明,也可能被內聯編譯
一些現代C++編譯器提供了擴展語法,能夠對函數進行強制內聯,如︰
g++ : _attribute__((always_inline)) 屬性
MSVC : _forceinline
C++中 inline 內聯編譯的限制:
不能存在任何形式的循環語句
不能存在過多的條件判斷語句
函數體不能過于龐大
不能對函數進行取址操作
不能對函數進行取址操作
讀到這里,這篇“C++的內聯函數怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。