最近从新捡起C++,突然有一个想法,为什么内联函数的会在头文件中申明和定义。
如果是C++新手,对申明和定义这两个词比较陌生,那么我先解释一下申明和定义的意思(原谅我废话多)
为什么需要内联函数?
函数调用包含一系列工作,例如保存寄存器,并在返回时恢复,可能需要拷贝实参,程序转向一个新的位置执行等,这些工作会有一定开销,如果把函数代码在调用点上内联地展开,就可以避免这些开销,加快了程序运行速度,代价是程序体积会随着内联的次数增大
一、申明和定义
申明一般放头文件中,定义一般放.cpp文件中。
比如现在我有个计算绝对值的函数。
首先我创建一个abs.h文件申明这个函数:
int abs(int a);
然后创建一个abs.ccp文件定义这个函数:
#include "abs.h"
int abs(int a){
if (a > 0){
return a;
}else{
return -a;
}
}
int main(){
return 0;
}
二、内联函数是什么?
简单点来说:内联函数就是把函数直接用函数体里面的代码替换。
如下,普通函数直接在前面建一个inline关键字就变成了内联函数。
inline int abs(int a){}
内联函数就是把函数直接用函数体里面的代码替换这句话意思就是说当我们调用abs函数的时候,编译器可以选择直接通过替换函数体里面的代码。也就是说直接进行如下操作:
int main(){
abs(-5);
return 0;
}
// 变成
int main(){
if (-5 > 0){
return -5;
}else{
return 5;
}
return 0;
}
三、内联函树为什么定义在头文件?
内联函数发生上面那种替换是在编译期间,在编译期间编译器为了找到需要找到内联函数的定义,所以在为了方便编译器找到定义,每个文件引用头文件后,都直接拥有这种定义,而不用再去写。
而普通函数可以申明和定义分离,主要是编译阶段就不需要函数定义。首先编译阶段找到函数的申明,链接阶段才会去找函数的定义,将之关联起来。
参考文献
[1] https://www.jianshu.com/p/e3c599549fb8
[2] https://zhuanlan.zhihu.com/p/35923250