【C++掌中宝】用最少的话让你全方位理解内联函数

在这里插入图片描述

文章目录

  • 引言
  • 1. 什么是内联函数
  • 2. 工作原理
  • 3. 内联函数的编程风格
  • 4. 使用限制
  • 5. 内联函数与宏的比较
  • 6. 优缺点
  • 7. 何时使用内联函数
  • 8. 补充
  • 9. 总结
  • 结语

引言

在C++编程中,函数的调用开销是程序运行效率的一个重要影响因素。为了解决频繁调用函数时的性能问题,C++提供了内联函数(inline),这是一种可以在编译阶段进行优化的技术。本文将详细介绍内联函数的概念、工作原理、使用限制以及与宏的比较。

1. 什么是内联函数

内联函数是使用inline关键字修饰的函数,目的是让编译器在函数调用时,将函数体直接展开到调用处,而不是通过常规的函数调用机制。其设计初衷是为了减少函数调用的开销,特别是在需要频繁调用的小型函数中。

例如,在以下代码中:

inline int add(int a, int b) {return a + b;
}

当调用add(3, 5)时,编译器会将该调用替换为3 + 5,从而避免了函数调用时的开销。

2. 工作原理

在程序执行过程中,常规函数的调用会涉及到参数传递、栈帧的建立与销毁,这一过程虽然对单次调用影响不大,但对于频繁调用的函数,这种开销将明显增加。内联函数通过在调用处直接展开函数体,消除了这些额外开销。

需要注意的是,内联仅仅是对编译器的建议,编译器可以根据实际情况决定是否展开内联函数。C++标准并没有规定编译器必须在何种情况下展开内联,因此不同编译器的处理可能有所不同。

例如:

#include <iostream>
inline char* checkOddEven(int a) {return (a % 2 > 0) ? "奇" : "偶";
}int main() {for (int i = 1; i < 100; i++) {std::cout << "i:" << i << " 奇偶性:" << checkOddEven(i) << std::endl;}
}

在上面的代码中,编译器将直接将checkOddEven(i)展开为(i % 2 > 0) ? "奇" : "偶",避免了每次循环调用函数的开销。

3. 内联函数的编程风格

  • inline必须与函数定义放在一起。仅仅在函数声明时加上inline关键字并不会使函数成为内联函数。
  • 内联函数一般应定义在头文件中,因为它们会在每个调用它的地方展开。
  • 不建议内联函数的声明和定义分离,可能会导致链接错误,因为inline被展开,就没有函数地址,链接时会出现报错。

错误示例:

inline void Foo(int x, int y);  // 声明不生效
void Foo(int x, int y) {// 函数体
}

正确示例:

inline void Foo(int x, int y) {// 函数体
}

4. 使用限制

  • 函数体必须足够简单:内联函数适用于小型、频繁调用的函数,过于复杂的函数不适合内联,因为代码膨胀会带来内存开销问题。
  • 递归函数不适合内联:内联函数不支持直接递归,即函数不能调用自身,因为这会导致无限展开,编译器将忽略内联请求。
  • 不适用于带有复杂控制结构的函数:如whileswitch等结构控制语句。

5. 内联函数与宏的比较

在C语言中,宏提供了类似的功能,但内联函数相比宏具有多项优势:

  • 类型检查:内联函数在编译时进行类型检查,而宏仅进行文本替换,可能导致难以发现的错误。
  • 调试友好:内联函数的调试信息更丰富,调试器能够识别函数的调用和执行路径,而宏则不易调试。
  • 作用范围:宏的文本替换可能会引发命名冲突和作用域污染,而内联函数则使用标准的函数调用机制。

示例:

#define SQUARE(x) ((x) * (x))
inline int square(int x) {return x * x;
}

相比宏,内联函数的调用方式更安全,也更加可控。

6. 优缺点

优点

  1. 提高运行速度:通过避免函数调用的开销,内联函数可以加速程序执行。
  2. 减少栈内存开销:不需要为每次函数调用建立栈帧。
  3. 更好的调试支持:内联函数在调试时更加直观。

缺点

  1. 代码膨胀:内联函数在调用处展开,会增加程序的代码体积,特别是在函数体较大时。
  2. 编译时间增加:内联函数可能增加编译时间,因为每次调用都需要展开函数体。
  3. 内联的局限性:并非所有函数都适合内联,编译器也可能选择不进行内联。

7. 何时使用内联函数

内联函数适用于小型、频繁调用且不涉及复杂逻辑的函数。以下场景适合使用内联函数:

  • 性能要求高:当函数的调用开销影响到程序性能时,内联可以帮助优化执行效率。
  • 替代宏定义:内联函数可以替代宏,避免宏带来的不安全性。

在类内部定义的函数默认是内联函数,适合隐藏类实现细节

8. 补充

vs编译器 debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置一下以下两个地方。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9. 总结

内联函数是C++中一种重要的优化手段,通过减少函数调用的开销来提高程序的运行效率。但它也有一定的局限性,特别是在代码膨胀和编译时间方面。因此,开发者在使用内联函数时应权衡利弊,合理选择合适的函数进行内联。总的来说,内联函数在优化小型、频繁调用函数时,能够带来显著的性能提升。

结语

这篇博客详细介绍了C++内联函数的概念、使用场景和优缺点,相信读者能够通过学习本文对内联函数有更深入的理解,并在实际开发中灵活运用内联技术来优化代码。

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/431758.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉必备模型YOLO系列模型的知识点,提供YOLOv1-v8模型结构与代码实例

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉必备模型YOLO系列模型的知识点&#xff0c;提供YOLOv1-v8模型结构与代码实例。本文全面介绍了计算机视觉领域中必备的YOLO系列模型&#xff0c;详细梳理了YOLOv1至YOLOv8模型的结构及其演变过程。文章内容…

linux设置常见开机自启动命令

本文介绍了三种开机自启的方式&#xff0c;重点介绍使用systemctl的方式自启动的 方式一、修改 /etc/rc.d/rc.local 文件 /etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要自己的脚本在开机后被运行的话&#xff0c;可以将自己脚本路径加到…

SQL - 进阶语法(二)约束

1. SQL约束 约束用于约束表中的数据规则&#xff0c;如若存在违反行为&#xff0c;行为会被约束终止。 • NOT NULL 确保列不能有NULL值 如果添加一行新的数据&#xff0c;不能有null值&#xff0c;否则无法添加 新建表格 CREATE TABLE new_table( ID int NOT NULL, NAME …

C语言中易混淆概念的关键字

最快的关键字---- register register&#xff1a; 这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以提高效率。注意是尽可能&#xff0c;不是绝对。你想想&#xff0c;一个 CPU 的寄存器也就那么 几个或几十个&#xff0c;你要是定义了很多很…

【环境踩坑系列】centos7安装python3.10.X

前言 虽然centOS8已经发布了相当一段时间了&#xff0c;但是基于稳定性、成熟的社区等原因&#xff0c;大家在选择centOS作为服务器操作系统的时候仍然会选择centOS7作为首选。但是centOS7自带的是python2.7.5&#xff0c;当前大量的python程序要用到的又是python3&#xff0c…

day-60 字符串中最多数目的子序列

思路 由题目可以得出&#xff0c;当字符串开头插入pattern[0]或在字符串结尾插入pattern[1]这两种情况中的一种所得到的子序列数目一定是最多的 解题过程 我们可以遍历字符串&#xff0c;统计pattern[0]的个数&#xff0c;每当遇到一个pattern[1]时&#xff0c;序列数就会加上…

蓝桥杯15届C/C++B组省赛题目

问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 5050 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 77 个人&#xff0c;这 77 人彼此之间没有进行握手 (但这 77 人与…

ProgrammerAI—AI辅助编程学习指南

前言 随着AIGC&#xff08;AI生成内容&#xff09;技术的快速发展&#xff0c;诸如ChatGPT、MidJourney和Claude等大语言模型相继涌现&#xff0c;AI辅助编程工具正逐步改变程序员的工作方式。这些工具不仅可以加速代码编写、调试和优化过程&#xff0c;还能帮助解决复杂的编程…

通义千问重磅开源Qwen2.5,性能超越Llama

简介&#xff1a; 击败Meta&#xff0c;阿里Qwen2.5再登全球开源大模型王座 9月19日云栖大会&#xff0c;阿里云CTO周靖人发布通义千问新一代开源模型Qwen2.5&#xff0c;旗舰模型Qwen2.5-72B性能超越Llama405B&#xff0c; 再登全球开源大模型王座。Qwen2.5全系列涵盖多个尺…

Tesla T4 P2P测试

Tesla T4 P2P测试 一.测试环境二.测试步骤1.获取设备信息2.查看PCIE拓扑结构3.选择9B、9E这二张4.查看逻辑设备ID5.设置环境变量(需要用逻辑设备ID,通过UUID跟smi看到的物理ID关联)6.不同地址的原子操作2.P2P与非P2P的性能差异3.GPU带宽测试 Tesla T4 P2P测试 通过物理ID找到逻…

多个ECU测试方案-IP地址相同-DoIP刷新-环境测试耐久测试

情况1&#xff1a;只有一个ECU进行测试 - 接口模块只需要使用一个车载以太网转换器&#xff1b; 情况2&#xff1a;多ECU同时测试&#xff0c;但ECU IP地址不一样&#xff0c;上位机多个网口 - 上位机测试软件&#xff0c;需要通过PC的不同网卡&#xff0c;访问各个ECU&#…

微信小程序开发第九课

一 后端上线 1.1 购买云服务器 1.2 安装python3.9 # 阿里云的centos上有python环境- python2.7.5 pip- python3.6.8 pip3-咱们项目开发&#xff0c;在3.9上开发的&#xff0c;需要使用3.9的解释器来运行# 可以使用yum 安装&#xff0c;不能指定版本&#xff08;yum i…

CorePress Pro 网站加载慢 WordPress

一般来说是你用了「CorePress天气模块」 解决方案&#xff1a;这个插件从你右侧边栏里删掉就可以了&#xff08;上方的图中已经是删掉后的效果了&#xff09; 寻找加载时间长的原因&#xff1a; 谷歌浏览器F12->网络->打开录制->ShiftF5 得出结论&#xff1a;和风天气…

Android 车载应用开发指南 - CarService 详解(下)

车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务&#xff0c;车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说&#xff0c;如何将自己的应用程序无缝集成到车载系统中&#xff0c;利用汽车的硬件和服务能力&#xff0c;是一个极具挑战性…

计算机网络:物理层 --- 基本概念、编码与调制

目录 一. 物理层的基本概念 二. 数据通信系统的模型 三. 编码 3.1 基本概念 3.2 不归零制编码 3.3 归零制编码 3.4 曼切斯特编码 3.5 差分曼切斯特编码 ​编辑 四. 调制 4.1 调幅 4.2 调频 4.3 调相 4.4 混合调制 今天我们讲的是物理…

【JavaEE】——线程的安全问题和解决方式

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;问题引入 二&#xff1a;问题深入 1&#xff1a;举例说明 2&#xff1a;图解双线程计算…

机器学习04-逻辑回归(python)-02原理与损失函数

​​​​​​​ 1. 逻辑回归概念 逻辑回归&#xff08;Logistic Regression&#xff09; 是一种 分类模型&#xff0c;主要用于解决 二分类问题&#xff08;即分成两类&#xff0c;如是否通过、是否患病等&#xff09;。逻辑回归的目标是根据输入的特征预测一个 概率&#xff0…

AI大模型项目实战v0.2: 结合个人知识库

前言 在AI大模型项目实战v0.1版本中&#xff0c;我们实现了一个最简单的基于纯LLM的问答机器人Tbot。 今天升级到v0.2版本&#xff0c;结合个人知识库。 本系列每个版本&#xff0c;都将提供完整的代码文档&#xff0c;获取方法见文末。 下面开启我们的v0.2版本之旅。 v0.2 Tb…

Icarus翼星求生教你使用服务器开服

1、购买后登录服务器&#xff08;百度莱卡云游戏面板&#xff09; 登录面板的信息在绿色的登陆面板按键下方&#xff0c;不是你的莱卡云账号 进入控制面板后会出现正在安装的界面&#xff0c;大约10分钟左右就能安装完成 2、创建端口 点击目录上的网络&#xff0c;再次页面下点…

中伟视界:AI算法如何精准识别井下与传送带上堆料,提升矿山安全生产效率,减少事故风险

传送带堆料分为两种情况&#xff0c;一种是传送带的井下堆料检测AI算法&#xff0c;一种是传送带上面的堆料检测AI算法&#xff0c;传送带井下堆料检测AI算法是在带式输送机的漏煤下方井下安装摄像仪&#xff0c;通过视频分析检测井下堆煤情况&#xff0c;当洒煤堆积到一定程度…