C++內(nèi)聯(lián)函數(shù)
什么是內(nèi)聯(lián)函數(shù)?
在函數(shù)的聲明和定義前加一個(gè) inline 關(guān)鍵字,這個(gè)函數(shù)就是內(nèi)聯(lián)函數(shù)。
通常會(huì)省略函數(shù)原型,即在聲明的同時(shí)就定義。
內(nèi)聯(lián)函數(shù)原理是什么?
內(nèi)聯(lián)函數(shù)在編譯期,在內(nèi)聯(lián)函數(shù)調(diào)用的地方執(zhí)行了代碼替換。
內(nèi)聯(lián)函數(shù)作用?
執(zhí)行一個(gè)普通的函數(shù)的開銷包括函數(shù)調(diào)用的開銷以及函數(shù)執(zhí)行的開銷。
如果函數(shù)執(zhí)行的開銷遠(yuǎn)小于函數(shù)調(diào)用的開銷,那么省略函數(shù)調(diào)用的開銷將會(huì)提高程序的運(yùn)行效率,這就是內(nèi)聯(lián)函數(shù)存在的意義。因此內(nèi)聯(lián)函數(shù)一般都是比較簡(jiǎn)短的調(diào)用。
但是,如果調(diào)用內(nèi)聯(lián)函數(shù)的地方比較多,那么編譯器會(huì)在每個(gè)調(diào)用的地方生成一個(gè)內(nèi)聯(lián)函數(shù)的副本,這樣內(nèi)存就相應(yīng)的增加了。
例子
#include <iostream>
// inline關(guān)鍵字定義了內(nèi)聯(lián)函數(shù)
inline double square(double x)
{
return x * x;
}
int main()
{
int a = 2;
double a = square(a++); // 內(nèi)聯(lián)函數(shù),編譯期執(zhí)行代碼替換,結(jié)果為 3 * 3
return 0;
}
C函數(shù)宏
C++的內(nèi)聯(lián)函數(shù)執(zhí)行了編譯期的代碼替換,這個(gè)替換動(dòng)作與C的函數(shù)宏有此類似,但不完全一樣.
#include <iostream>
#include <stdio.h>
// C定義的函數(shù)宏
#define SQUARE(X) X*X
// C++定義的內(nèi)聯(lián)函數(shù)
inline double square(double x)
{
return x * x;
}
int main()
{
double a = 2;
double b = SQUARE(a++); // C函數(shù)宏替換,結(jié)果為a++*a++
printf("b = %f\n", b); // 6.000000
double c = 2;
double d = square(c++); // C++內(nèi)聯(lián)函數(shù)替換,結(jié)果為2*2,而不是c++*c++
std::cout << "d = " << d << std::endl; // 4
return 0;
}
同樣是求一個(gè)數(shù)的平方,C的函數(shù)宏卻得到了不一樣的結(jié)果。