【C++】内联函数为什么定义在头文件中?

最近从新捡起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

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值