1. 内联函数
- 编译器将使用相应的函数代码替换函数调用。
- 内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。
2. 内联函数的使用
- 在函数声明和定义须前加上关键字
inline
;
#include<iostream>
inline double square(double x){return x*x;}
int main()
{
using namespace std;
double a,b;
double c = 13.0;
a = square(5.0);
b = square(4.5+7.5);
cout<<"a="<<a<<",b="<<b<<endl;
cout<<"c="<<c<<endl;
cout<<"c squared="<<square(c++)<<endl;
cout<<"now c="<<c<<endl;
return 0;
}
输出:
a=25,b=144
c=13
c square=169
now c=14
3. 内联函数和宏定义的区别
C语言
使用预处理器语句#define
来提供宏。
#define SQUARE(X) X*X
宏定义时通过文本替换来实现的,X是参数的符号标记。
a = square(5.0);->a=5.0*5.0;
b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
d = square(c++);->d=c++*c++
可以看出,对于b,需要使用括号才能正常运算。
#define SQUARE(X) ((X)*(X))
⚠️ 对于c,却仍递增了两次。
两者区别如下:
- 宏定义和内联函数存在本质的区别,转换的时候应考虑是否转换后功能是否正常。
- 内联函数在编译器时展开,宏在预编译时展开。
- 在编译的时候内联函数可以直接被嵌入到目标代码中,而宏只是一个简单的文本替换。
- 内联函数可以完成诸如类型检查、语句是否正确等编译功能,宏就不具有这样的功能。
- 宏不是函数,inline函数是函数。
- 宏在定义时要小心宏参数(一般情况是把参数用括号括起来),否则容易出现二义性。而内联函数定义时不会出现二义性。