C++深度剖析教程4 --- 內聯函數分析

– 作者 Allen 轉載請註明出處
微信公衆號「炫色Allen」(微信號:Allen5G)

常量和宏的關係
在這裏插入圖片描述
c++中推薦使用內聯函數替代宏代碼塊
c++使用inline關鍵字聲明內聯函數

在這裏插入圖片描述
內聯函數聲明inline關鍵字和函數定義結合在一起,否則編譯器會直接忽略內聯請求

c++編譯器可以講一個函數進行內聯編譯
被c++編譯器內聯編譯的函數叫做內聯函數
c++編譯器直接將函數體插入函數調用的地方
內聯函數沒有普通函數調用時的額外開銷(壓棧,跳轉。返回)
c++編譯器不一定滿足函數的內聯的要求

4-1 內聯函數

#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;
}

直接運行結果:預測的是2 3 2
問題是宏代碼塊是有副作用的,可以使用內聯函數

在這裏插入圖片描述
這個時候使用VS的反彙編功能
在這裏插入圖片描述
轉到反彙編
在這裏插入圖片描述
彙編代碼:

    int c = FUNC(++a, b);
012B13AC  mov         eax,dword ptr [a]  
012B13AF  add         eax,1  
012B13B2  mov         dword ptr [a],eax  
012B13B5  mov         ecx,dword ptr [a]  
012B13B8  cmp         ecx,dword ptr [b]  
012B13BB  jge         main+51h (12B13D1h)  
012B13BD  mov         edx,dword ptr [a]  
012B13C0  add         edx,1  
012B13C3  mov         dword ptr [a],edx  
012B13C6  mov         eax,dword ptr [a]  
012B13C9  mov         dword ptr [ebp-0E8h],eax  
012B13CF  jmp         main+5Ah (12B13DAh)  
012B13D1  mov         ecx,dword ptr [b]  
012B13D4  mov         dword ptr [ebp-0E8h],ecx  
012B13DA  mov         edx,dword ptr [ebp-0E8h]  
012B13E0  mov         dword ptr [c],edx

從反彙編可見,實際是沒有同意請求的內聯函數

vs內部修改方式
在這裏插入圖片描述

內聯函數
c++中首選內聯函數,而不是宏代碼塊
在這裏插入圖片描述
在這裏插入圖片描述
4-2 內聯函數實例

#include <stdio.h>

//__forceinline   功能是幾乎一樣的,都是隨着程序性能提升誕生的
//__attribute__((always_inline))   //g++提供的強制內聯函數
inline   標準c++提供的
int add_inline(int n);

int main(int argc, char *argv[])
{
    int r = add_inline(10);

    printf(" r = %d\n", r);

    return 0;
}

inline int add_inline(int n)
{
    int ret = 0;

    for(int i=0; i<n; i++)
    {
        ret += i;
    }

    return ret;
}

注意事項:僅針對c++中的inline
不過隨着技術發展,慢慢下邊的都是支持的(主要是面對使用的有可能是很古老的PC)
在這裏插入圖片描述

小結:主要是隨着技術發展

在這裏插入圖片描述

本文參考狄泰軟件學院相關課程,可以加狄泰軟件學院羣學習
Q羣號碼:199546072

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章