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

【C++】内联函数inline

文章目录

  • 概念
  • 使用
  • 特性
  • 原理


概念

C++中内联函数的出现解决了C语言宏函数的不足,类似于宏展开,这种在函数调用处直接嵌入函数体的函数称为内联函数,又称内嵌函数或内置函数。

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

使用

在函数的返回值前加上inline关键字即可。

#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int ret = Add(10,20);
	cout<<ret<<endl;

	return 0;
}

如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

特性

1)短小的,频繁调用的函数才适合声明为内联函数。要知道inline对于编译器而言只是一个建议,不是强制性的,编译器有自己的判断能力。

2)为什么函数体长了之后,内联函数不展开?

如果函数体代码比较长,如递归等,使用内联函数会导致代码膨胀。会导致编译后的程序存在多份相同的拷贝,编译出来的可执行程序也会非常大,会消耗更多的内存空间,如果指向函数体代码的时间比函数调用的开销大的多,那么inline效率收益会很小

3)所以inline是一种空间换时间的做法(空间:由于函数体代码展开,编译出来的可执行程序大小/静态库,动态库/会变大)

4)综上,内联函数的缺点:可能会使目标文件变大;优点:少了调用开销,提高程序运行效率

5)inline内联函数不建议声明和定义分离
在这里插入图片描述
在这里插入图片描述
错误定义:声明和定义分离如下:
在这里插入图片描述

解决方法:直接在头文件中定义内联函数

在这里插入图片描述

原理

我们通过查看程序代码的反汇编语言,来了解一下inline函数的执行原理:

查看方式:

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add
  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)

先右击项目,点击项目属性。
在这里插入图片描述
我们先来看一段普通函数f的调用过程(通过查看debug下的汇编代码):
在这里插入图片描述
内联函数的原理即底层调用方式:
在这里插入图片描述


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

相关文章:

  • 《LLM大语言模型+RAG实战+Langchain+ChatGLM-4+Transformer》
  • 【四川乡镇界面】图层shp格式arcgis数据乡镇名称和编码2020年wgs84无偏移内容测评
  • HarmonyOS应用开发快速入门
  • React Router v6配置路由守卫
  • [论文总结] 深度学习在农业领域应用论文笔记14
  • 使用 postman 测试思源笔记接口
  • 数据结构与算法——堆的基本存储
  • 电路设计的一些概念
  • 华为OD机试题,用 Java 解【卡片组成的最大数字】问题 | 含解题说明
  • 8个你一看就觉得很棒的Vue开发技巧
  • Liunx下的进程程序替换
  • GitHub Actions工作流搭建
  • jmeter 响应时间rt很小,但是tps也很小jmeter,脚本处理,千万不要用js
  • SpringBoot实战(十三)集成 Admin
  • 技术分享——Java8新特性
  • C语言——字符函数和字符串函数【详解】(一)
  • 如何才能做好Android 性能优化?
  • 基于Linux内核的驱动开发
  • Vue趣味【Vue3+Element Plus+Canvas实现一个简易画板;支持导出为图片】
  • new动态内库管理库学习
  • 【统计学习】25个必须掌握的数据分析基础概念
  • C# 委托
  • 【ARCore】Android ARCore 简介 ( AR 增强现实技术简介 | Android 平台常用的 AR 技术 | ARCore 相关资料收集 )
  • 从0到1深度学习环境搭建
  • 你值得拥有——流星雨下的告白(Python实现)
  • 20美刀一个月的ChatGPT架构师,性价比逆天了