之前参加竞赛时,总是会看见一些大佬的函数前面加上个inline,比如下面的快读:

1
2
3
4
5
6
7
8
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}

问之,则曰:

“这样会运行快一点”

但是我一直都没搞懂,为什么说这样运行就会快一点


今天特地查了一下,这个inline是内联函数的标识符,那内联函数又是什么?

如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方

这样一来,优点就显而易见了:普通函数都是单独保存的,当你调用函数时,要先通过指针跳到函数的位置再运行,而内联函数直接就嵌在调用该函数的地方(类似于宏替换),省去了寻址步骤,自然更快

也许你可能会问,一个寻址要耗多少时间呢?但其实对于非常简单的函数来说(如两个int求较大值),寻址的时间占比就很大,而这种简单的函数往往又是比较常用的,一来二去,寻址时间就又被放大了

但缺点也是显而易见的:增加内存消耗,并且内联函数中不能递归调用自己

所以,只有短小简单,调用又十分频繁的函数才适合作为内联函数

使用起来很简单,在函数头前面加上个inline就行,但有一点要注意,inline修饰的函数要当场给出其原型,并且inline在声明的时候是没有用的,只有定义的时候才有用

这个写法是无效的:

1
2
3
4
5
6
inline int max(int a,int b);

int max(int a,int b)
{
//......
}

这个写法是有效的:

1
2
3
4
5
6
int max(int a,int b);

inline int max(int a,int b)
{
//......
}

PS:C++ 的类里面的成员函数会被默认为内敛函数