当前位置: 首页 > article >正文

【C++】内联函数理解

内联函数

内联函数的使用是对于C语言中宏函数的一种改进,他继承了宏的优点并避免了宏的缺点。
宏的优点:a. 代码复用性高 b. 宏函数减少栈帧建立,提高效率
宏的缺点:a. 可读性差 b. 没有类型安全检查 c. 不方便调试
C++基本不再建议使用宏,而是建议尽量使用constenumInline去替代宏。

inline修饰的函数就叫做内联函数。inline在符合条件的情况下,编译时C++编译器会在调用内联函数的地方进行展开,此时就没有建立栈帧的开销,提高了程序运行的效率。

内联函数展开的查看方式:

(VS2019-Debug为例)
在这里插入图片描述
在这里插入图片描述
在不使用inline情况下查看汇编代码:

/*inline */int ADD(int x, int y)
{
	return x + y;
}

int main()
{
	/*int ret1 = */ADD(1, 2);

	/*int ret2 = */3 * ADD(1, 2);

	return 0;
}

在这里插入图片描述
使用inline后查看汇编代码:

inline int ADD(int x, int y)
{
	return x + y;
}

在这里插入图片描述
这里编译器优化太过了,汇编代码没有显示,可以尝试通过接收返回值来查看。
在这里插入图片描述
可以看到汇编代码中没有了call指令,而是将函数在调用的地方直接展开来使用了。

内联函数特性:

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会使用函数体替换函数调用。这样做可能会使目标文件变得很大(缺点),但少了函数调用开销,提高了程序运行效率(优点)。
  2. inline对于编译器只是一个建议,编译器会自动优化。一般建议:将函数规模较小(即函数不是很长,具体没有准确地说法,取决于编译器的内部实现)、不是递归频繁调用的函数采用inline修饰,否则编译器会忽略掉inline特性。

一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数。很多编译器都不支持内联递归函数,而且一个75行的函数也不大可能在调用点内联地展开。 —— 《C++ prime》

以下是inline函数内部不同指令长度情况下,编译器自动对内联函数展开与否所做出的判断结果。
在这里插入图片描述
在这里插入图片描述
3. inline不建议声明和定义分离,这样会导致链接错误。因为inline被展开了,就没有函数地址了,链接时就会找不到。

//func.h
inline int func(int x, int y);

//func.cpp
#include "func.h"

int func(int x, int y)
{
	int ret = 0;
	ret = x + y;
	ret = x - y;
	ret = x * y;
	ret = x / y;

	return ret;
}

//test.cpp
#include "func.h"

int main()
{
	int ret = func(1, 2);

	return 0;
}

在这里插入图片描述
所以再使用内联函数时,可以将inline函数的定义放在.h文件中。

//func.h
inline int func(int x, int y)
{
	int ret = 0;
	ret = x + y;
	ret = x - y;
	ret = x * y;
	ret = x / y;

	return ret;
}

http://www.kler.cn/a/10264.html

相关文章:

  • 国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?
  • Spring Boot集成SQL Server快速入门Demo
  • day60 图论章节刷题Part10(Floyd 算法、A * 算法)
  • Spring学习笔记(四)
  • ARXML汽车可扩展标记性语言规范讲解
  • 自监督学习:机器学习的未来新方向
  • d修复导入c的问题
  • MySQL日志
  • 如何驯化生成式AI,从提示工程 Prompt Engineering 开始
  • Day939.如何小步安全地升级数据库框架 -系统重构实战
  • 银行数字化转型导师坚鹏:ChatGPT解密与银行应用案例
  • 鸟哥的Linux私房菜 学习 Shell Scripts
  • 【CSS】实现梯形
  • C语言实例:求一个整数的所有因数,创建各类三角形图案(代码+思路)
  • AB测试基本原理
  • t-SNE进行分类可视化
  • 【SpringMVC】7—文件上传
  • 详细讲讲Java线程的状态
  • 林长制信息系统主要建设思路
  • Java实现图片缩放裁剪,图片像素比例变更,批量转换图片像素比
  • 遗传算法优化深度信念网络DBN的分类预测,GA-DBN分类预测
  • C++ 的fcntl函数
  • ChatGPT搭建语音智能助手
  • 工作中英语学习的几个阶段
  • Three.js教程:第一个3D场景
  • 【MyBatis Plus】003 -- 配置(基本、进阶、DB策略) 条件构造器