从c到c++——5:内联函数

在调用常规函数时,我们会在它的汇编代码中看到call指令。

如果我们继续调试,如果我们继续调试,会发现执行call会跳转到其他地方,之后会再调用一堆其他的指令,在我的测试(vs2022)下:

cpp 复制代码
//int add(int x, int y)
//{
//	return x + y;
//}

int ret=add(1, 1);    //29行汇编指令
int tmp = 1 + 1;      // 1行汇编指令

差了整整29倍!这实在是不妥啊!


对于一些函数,比如判断结构体大小,交换结构体值之类没有调用其他函数 ;函数本身是十分简短 的并且不是很常用的。如果能在调用他们时不执行call命令而直接使用函数本体,即可提高代码运行效率,内联函数便是启这个作用。

只需在函数名前加上inline即可。(编译器可以拒绝内联的要求)

cpp 复制代码
//对比实验
int add(int x, int y)
{
	return x + y;
}
inline int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ret1=add(1, 1);
	int ret2 = 1 + 1;
	int ret3=Add(1, 1);
	return 0;
}

可以看出,内联函数已经由原来的29行汇编代码变为了3行汇编代码,运行效率会高很多。不过毕竟有创建变量和销毁变量的操作,运行效率会略低于直接调用。


使用内联函数本质上是一种以空间换时间的操作,因为非内联函数每次调用时只需要call一个地址即可,而理论上内联函数会把所有的汇编代码都移过来,汇编再转成二进制文件,如果函数代码量很大,最终的可执行程序也会很大(有没有想到一些动不动更新几个G的神仙游戏)
需要注意:编译器为了优化程序性能,会对内联函数进行检测,如果代码较为复杂,将拒绝内联的要求

相关推荐
周杰伦_Jay1 分钟前
【Go语言面试题核心详细解析】基础语法、并发编程、内存管理、接口、错误处理
开发语言·后端·golang
福尔摩斯张2 分钟前
Linux Kernel 设计思路与原理详解:从“一切皆文件“到模块化架构(超详细)
java·linux·运维·开发语言·jvm·c++·架构
smile_Iris7 分钟前
Day 41 早停策略和模型权重的保存
开发语言·python
傅里叶的耶8 分钟前
C++ Primer Plus(第6版):第四章 复合类型
开发语言·c++
MediaTea13 分钟前
Python:接口隔离原则(ISP)
开发语言·网络·python·接口隔离原则
承渊政道14 分钟前
C++学习之旅【C++内存管理、模板初阶以及STL简介】
c++·学习·visual studio
Clarence Liu14 分钟前
Golang slice 深度原理与面试指南
开发语言·后端·golang
遇印记16 分钟前
java期末复习(构造方法和成员方法,重写和重载)
java·开发语言·学习
郝学胜-神的一滴16 分钟前
使用Qt OpenGL开发俄罗斯方块:从零到一实现经典游戏
c++·qt·程序人生·游戏·设计模式·系统架构·图形渲染
weixin_3077791316 分钟前
Jenkins声明式流水线权威指南:从Model API基础到高级实践
开发语言·ci/cd·自动化·jenkins·etl