中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的內聯函數怎么使用

發布時間:2022-04-21 17:14:08 來源:億速云 閱讀:183 作者:zzz 欄目:開發技術

本文小編為大家詳細介紹“C++的內聯函數怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C++的內聯函數怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、常量與宏回顧

C++中的const常量可以替代宏常數定義,如︰

C++的內聯函數怎么使用

但是C++中是否有解決方替代宏代碼片段呢?這里就要引入內聯函數。

二、內聯函數

  • C++中推薦使用內聯函數替代宏代碼片段

  • C++中使用 inline 關鍵字聲明內聯函數

C++的內聯函數怎么使用

內聯函數聲明時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。

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++的內聯函數怎么使用

下面在 VS2012 中看一下反匯編的代碼,看一看內聯有沒有成功。可以看到 func 函數被調用,而不是直接擴展到被調用的地方,內聯沒有成功。inline 這個關鍵字僅僅是請求將函數內聯,但是不一定會成功。

C++的內聯函數怎么使用

為了讓編譯器允許對內聯的請求,可以對編譯器進行一些配置,如下圖

C++的內聯函數怎么使用

C++的內聯函數怎么使用

配置好以后,在 int c = func(++a, b); 前面打個斷點,開始跑代碼,但是我跑的時候報錯了。

C++的內聯函數怎么使用

這個時候,進行下面配置,那個錯誤就解決了。

C++的內聯函數怎么使用

這個時候在進行反匯編,如下圖所示,可以看到調用函數的匯編代碼沒有了,表示內聯成功了。

C++的內聯函數怎么使用

  • 內聯函數具有普通函數的特征(參數檢查,返回類型等)

  • 函數的內聯請求可能被編譯器拒絕

  • 函數被內聯編譯后,函數體直接擴展到調用的地方

宏代碼片段由預處理器處理,進行簡單的文本替換,沒有任何編譯過程,因此可能出現副作用。

現代C++編譯器能夠進行編譯優化,一些函數即使沒有inline聲明,也可能被內聯編譯

一些現代C++編譯器提供了擴展語法,能夠對函數進行強制內聯,如︰

  • g++ : _attribute__((always_inline)) 屬性

  • MSVC : _forceinline

三、內聯函數使用注意事項

C++中 inline 內聯編譯的限制:

  • 不能存在任何形式的循環語句

  • 不能存在過多的條件判斷語句

  • 函數體不能過于龐大

  • 不能對函數進行取址操作

  • 不能對函數進行取址操作

讀到這里,這篇“C++的內聯函數怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

南开区| 静海县| 东阳市| 余庆县| 察隅县| 青海省| 绵阳市| 张家界市| 卢氏县| 龙泉市| 车致| 岳阳县| 邮箱| 阿荣旗| 隆昌县| 张家口市| 湄潭县| 葵青区| 沧州市| 扬中市| 郯城县| 长寿区| 房产| 镇宁| 西和县| 博湖县| 陇西县| 兰西县| 泰来县| 精河县| 贡觉县| 东莞市| 岳阳市| 望奎县| 建水县| 公安县| 长白| 峨眉山市| 西华县| 察哈| 广德县|