- 什么是内联函数?
内联函数的定义很简单,在函数定义前面加上关键字inline即可,例如:
inline void func(){
//函数体
}
当程序编译的时候,其他调用func()函数的地方,会被func()函数的函数体替换,比如:
#include <iostream>
using namespace std;
inline void func(){
//函数体
int A = 3;
cout<<A<<endl;
}
int main(){
int A = 5;
func();
cout<<A<<endl;
return 0;
}
程序在编译的时候,main()中的func()会被int A = 3; cout<<A<<endl;
代替。而且,内联函数里的局部变量依然只作用于函数体内。
2. 内联函数存在的意义是什么?
第一,提高函数调用效率。当函数仅有简单几行代码时,调用此函数的主要开销在调用机制上了,可能还要别的文件查询,而内联函数就节省了这一笔开销。但是需要注意的是,仅在函数功能十分简单的时候才有用。
第二,代替带参数的宏。#define A B
可以将代码中的A在编译阶段都用B代替,但是当B
是一个表达式的时候,会增加程序出现逻辑bug的风险。比如下面的代码:
#include <iostream>
using namespace std;
#define Q(x) x*x
int main(){
int a = 1;
cout<<Q(a+1)<<endl;
}
你会发现,程序输出结果并不是我们预想中的4
,而是3
,因为#define
指令在编译的时候,只是简单粗暴的将Q(a+1)
换成了a+1*a+1
。当然,我们给第三行改成#define Q(x) (x)*(x)
,确实能够解决例子中的问题,但是如果Q(a+1)
变成了10/Q(a+1)
,你会发现结果又不对了,因此#define
在替换成表达式的时候需要格外小心,但是使用内联函数就不会有这么多顾虑了。
- 注意事项
第一,不要在函数体比较复杂的时候使用;
第二、内联函数在编译完了之后就消失了,所以不要将函数定义和函数调用写在不同文件(除非写在头文件),否则可能出现某个地方调用了该函数,但是链接器又找不到的情况。