C++基础之——内联函数

内联函数

首先我们先了解一下函数的调用规则以及内存分区:

上图是函数调用的一个流程图,在我们程序运行到函数调用部分的时候,我们需要执行函数,而函数需要在栈区开辟空间,这一操作需要花费时间和空间,在执行完函数之后,需要返回到函数调用的部分,这一行为需要采取"寻址"这一操作,同时,也花费了时间。

再说说内存分区:

我们的内存地址存储顺序为从常量区到内核的地址是逐渐递增的方式,在栈区中相反,我们常说的代码区就是在常量区中。

宏函数

在介绍内联函数之前,我们先来回顾学习一下,什么是宏呢?

  • 宏函数,定义常量
  • 本质:文本替换
  • 特点:速度快,直接进行文本替换,相当于直接将函数中的东西复制过来,也就相当于调用部分不是一个函数免去了时间消耗,但是由于需要把调用部分换成宏函数中的代码,但是宏函数中的代码需要在常量区中的代码区开辟空间,所以花费了空间。省去了开辟函数栈以及寻址的时间。

下面我们来看一组代码:

#include<iostream>
using namespace std;
#define ADD(x,y) ((x) + (y))
#define ADD_One(x,y) (x * y);

int main() {
	cout << ADD("asd", 1) << endl;//宏定义没有类型检查

	cout << ADD_One(1 + 2, 3 + 4);//宏定义有二义性
}

执行结果:

下面我们来解释一下为什么出现这种结果:

  • 输出结果为sd的原因:"asd"为字符串首地址也就是字符‘a’的地址,a的地址加一就是字符串"sd"的地址,所以输出"sd",由此可以看出宏定义没有类型检查。
  • 再看第二个输出结果"11":将代码带入到宏函数中得出的式子为1 + 2 * 3 + 4计算出的结果就为11,由此可以看出宏定义有二义性。

ps:二义性:一个语句有多种结果。

为了避免出现这种类似的我们不想看到的结果,通常采用——内联函数。

如图:当发生函数中的代码运行所需的时间小于开辟函数以及函数返回寻址所需的时间时,我们可以采用内联函数。

内联函数的定义:

        以“inline”修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开没有函数压栈的开销,内联函数提升了程序运行的效率。

        如果一个函数本身就是几十行甚至上百行,那么函数本身执行所需要的时间就会很大,则调用函数,创建栈帧(每一个栈帧都对应着一个未运行完的函数,栈帧中保存了该函数的返回地址以及函数中的局部变量,我们也可以理解为栈帧就是函数运行时所开辟的函数栈)所需的时间可以忽略不计;但若是一个函数本身就一两行运行函数的时间调用函数本身以及函数返回寻址所需的时间相比可以忽略不计的话,宏函数或者内联函数的提前替换就显得格外优秀,提高了运行效率。

#include <iostream>//类内的内联函数如果在内类声明类外实现 类内和类外必须都得在返回值类型前加 inline
using namespace std;
inline int add(int a, int b) {
	return a + b;
}
int main() {
	cout << add(1 + 2, 3 + 5) << endl;
}

内联函数的特点:

  • inline是一种以空间换时间的做法,省去了调用函数,建立栈帧的额外开销,但如果函数里的代码很长,或者有递归函数,因为我们的编译器很智能可以选择最优的方式来判断是否将其定义为内联函数,若函数本身消耗时间就很大,即使在函数前面声明了inline,编译器也不会让该函数成为内联函数。
  • inline对于编译器而言只是一个建议,编译器会自动优化,会根据函数所需时间判断是否要将该函数定义为内联函数
  • inline不可以声明和定义分离,在.h头文件中使用inline声明内联函数则.cpp文件中不适用inlin定义函数的话,会报错连接错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coke_3.2.2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值