– 作者 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