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

C++中的内联函数

在C++中,内联函数是一种特殊的函数。

定义

内联函数是在函数定义前加上关键字“inline”的函数。编译器在处理对内联函数的调用时,会尝试将函数体的代码直接插入到函数调用处,而不是像普通函数调用那样,进行跳转指令执行函数体代码后再返回。例如:

inline int add(int a, int b) {//add 函数就是内联函数。
return a + b;
}

内联函数与普通函数的区别:

1. 调用方式

普通函数:在程序执行到函数调用语句时,会将控制权转移到被调用函数的入口地址,执行函数体中的代码。这涉及到创建栈帧来存储函数的局部变量、参数等信息,当函数执行完毕后,再将控制权返回给调用函数,并释放栈帧。例如:

int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 5);
return 0;
}
//在 main 函数中调用 add 函数时,程序会跳转到 add 函数的代码处执行,完成后再返回 main 函数。

内联函数:编译器会尽量将内联函数的代码直接嵌入到函数调用点,就好像在调用处直接书写函数体的代码一样。这样在程序执行时,就不会有函数调用的开销,例如创建和销毁栈帧等操作。例如:

inline int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 5);
return 0;
}
//编译器可能会将 add 函数体的代码 return a + b; 直接放在 main 函数中 add 函数调用的位置。

2. 性能表现

  • 普通函数:由于存在函数调用开销,对于一些频繁调用且功能简单的函数,这些开销可能会影响程序的性能。例如,一个在循环中被多次调用的小函数,每次调用的栈帧操作等可能会使程序执行速度变慢。
  • 内联函数:通过减少函数调用开销,对于简单且频繁调用的函数,能有效提高程序的执行速度。但如果内联函数体代码过长或者包含复杂的结构(如递归、循环等),可能会导致代码膨胀,增加程序的内存占用,反而可能影响性能。

3. 代码大小

  • 普通函数:函数代码在内存中只有一份,无论在程序的多少个地方调用这个函数,都不会增加函数代码本身占用的内存空间,只是每次调用会有栈帧等额外开销。
  • 内联函数:如果一个内联函数在多个地方被调用,那么函数体的代码会在每个调用点都被插入一份,这可能会导致可执行程序的代码量增大,尤其是对于被频繁调用的内联函数。

4. 适用场景

1)普通函数:适用于功能复杂、代码量较大、不经常调用或者递归调用的函数。例如,一个用于复杂文件读取和解析的函数,由于其功能复杂且调用频率相对较低,更适合作为普通函数。

2)内联函数:适合函数体较小(一般建议只有几行代码)、频繁调用的函数。比如,简单的数学运算函数(如加法、减法函数),将它们定义为内联函数可以提高程序效率。

如何定义和使用内联函数:

 1. 定义内联函数

方式一:在函数定义处添加 inline 关键字

在C++中,最常见的方式是在函数定义之前添加 inline 关键字。例如,定义一个简单的内联函数来计算两个整数的和:

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

方式二:在类内定义函数成员(隐式内联)

当在类的内部定义成员函数时,该函数默认是内联函数。例如:

class MyClass {
public:
int multiply(int x, int y) {
return x * y;
}
};

这里 MyClass 类中的 multiply 函数就是内联函数。不过需要注意的是,如果函数体比较复杂,编译器可能不会将其当作内联函数处理。

2. 使用内联函数

内联函数的使用方式和普通函数相同。例如,调用上面定义的 add 函数:

int main() {
int num1 = 3, num2 = 5;
int sum = add(num1, num2);
return 0;
}

当编译器处理这段代码时,会根据内联函数的定义规则,尝试将 add 函数的代码插入到 add 函数调用的位置。不过,最终是否真正内联是由编译器决定的。有些情况下,即使定义为内联函数,编译器也可能因为函数体复杂(如包含循环、递归等)或其他优化策略而不进行内联处理。 

内联函数的作用:

  • 提高程序执行效率
  • 减少函数调用开销。对于普通函数,每次调用时需要保存当前的执行上下文(如寄存器的值、程序计数器等),然后建立函数栈帧,进行参数传递等操作。而内联函数将代码直接展开在调用处,避免了这些额外的开销,特别是对于频繁调用的小函数,能显著提高程序运行速度。
  • 例如,在一个循环中频繁调用一个简单的计算函数,如果这个函数是内联函数,就可以直接在循环体中展开代码,减少了每次调用的时间损耗。
  • 保持程序结构清晰
  • 内联函数和普通函数一样可以实现代码的封装,使程序的逻辑结构更清晰。它把具有独立功能的代码段封装成一个函数,方便代码的维护和阅读。
  • 比如,有一个简单的功能是计算两个数的最大值,将其封装成内联函数,在代码的其他部分就可以通过函数调用的形式清晰地使用这个功能,而不是在多个地方重复编写相同的比较代码。

相关文章:

C++中的内联函数

在C中,内联函数是一种特殊的函数。 定义 内联函数是在函数定义前加上关键字“inline”的函数。编译器在处理对内联函数的调用时,会尝试将函数体的代码直接插入到函数调用处,而不是像普通函数调用那样,进行跳转指令执行函数体代码…...

ssh.service could not be found“

如果你收到 “ssh.service could not be found” 错误,说明目标主机上没有安装 SSH 服务,或者安装的 SSH 服务的名称不为 ssh。这里有一些解决步骤: 1. 检查 SSH 服务是否已安装 在目标主机上执行以下命令来检查是否安装了 SSH 服务&#x…...

tensorflow有哪些具体影响,和chatgpt有什么关系

### TensorFlow的影响 **1. 深度学习框架的领军者** - **广泛使用**: TensorFlow是由Google开发的开源深度学习框架,广泛应用于各种机器学习任务,包括图像识别、自然语言处理、语音识别等。它是深度学习领域中最受欢迎的框架之一。 - **大规模生产环境*…...

Android OpenGL ES详解——几何着色器

目录 一、概念 1、图元 2、几何着色器 1、输入类型 2、输出类型 3、输出顶点数量最大值限制 二、使用几何着色器 三、应用举例——造几个房子 四、应用举例——爆破物体 1、获取法向量 2、显示法线 五、应用举例——细分三角形 六、应用举例——广告牌技术 一、概…...

Java学生管理系统(GUI和数据库)

Java学生管理系统(GUI和数据库) 本文简介 本资源演示了一个用Java实现的学生管理系统,结合了图形用户界面(GUI)和数据库操作。系统实现了学生、课程和账号三张表的管理功能,包括增删改查等操作。通过本资…...

035_Progress_Dialog_in_Matlab中的进度条对话框

进度条 概念 在使用Matlab开发界面时,有一个很好用的工具就是进度条。在计算过程中,为用户提供计算进度的反馈是改善用户体验的重要手段。 一项进行的计算任务,如果其总体进度是比较容易量化,则可以按照0%~100%的方式&#xff0…...

【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯GPTs指令💯前言💯Ai-Ming主要功能适用场景优点缺点 💯小结 💯GPTs指令 中文翻译: defcomplete_sexagenary(年&a…...

如何利用SAP低代码平台快速构建企业级应用?

SAP作为全球领先的企业管理软件解决方案提供商,一直致力于为企业提供全面且高效的业务管理工具。随着技术的快速发展,传统的开发方式已经无法满足企业在快速变化的市场环境下的需求。低代码开发平台应运而生,它通过简化应用程序的创建过程&am…...

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding,水平切分)来进行数据共享,并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点(node)组成,在刚开…...

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码

社团活动与组织 信息发布:系统支持社团发布活动信息、招募新成员等,方便社团进行线上线下活动的组织和管理。 增强凝聚力:通过系统,社团成员可以更好地交流和互动,增强社团的凝聚力和影响力。 生活服务功能 二手市场…...

鸿蒙核心技术理念

文章目录 1)一次开发,多端部署2)可分可合,自由流转3)统一生态,原生智能1)一次开发,多端部署 “一次开发,多端部署”指的是一个工程,一次开发上架,多端按需部署。目的是支撑开发者高效地开发多种终端设备上的应用 2)可分可合,自由流转 元服务是鸿蒙系统提供的一…...

8. 基于 Redis 实现限流

在高并发的分布式系统中,限流是保证服务稳定性的重要手段之一。通过限流机制,可以控制系统处理请求的频率,避免因瞬时流量过大导致系统崩溃。Redis 是一种高效的缓存数据库,具备丰富的数据结构和原子操作,适合用来实现…...

241117学习日志——[CSDIY] [ByteDance] 后端训练营 [05]

CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...

蓝桥杯备赛(持续更新)

16届蓝桥杯算法类知识图谱.pdf 1. 格式打印 %03d:如果是两位数,将会在前面添上一位0 %.2f:会保留两位小数 如果是long,必须在数字后面加上L。 2. 进制转化 2.1. 十进制转任意进制: 十进制转任意进制时&#xff…...

k8s 学习笔记之 k8s 存储管理

文章目录 概述卷卷的常用类型emptyDir边车容器 HostPathnfsPV/PVC静态供给 PV 和 PVC创建静态 PV创建 pvc创建 pod 应用 pvc 动态供给 PV 和 PVC创建 StorageClass创建 pvc创建 pod 使用 pvc PV 的生命周期 内置存储对象ConfigMapSecret 配置文件自动重新加载方案**1. 应用内动…...

ios swift开发--ios远程推送通知配置

远程推送通知(Push Notifications)在 iOS 平台上是免费提供的,但需要一些准备工作。以下是开通和使用远程推送通知的基本步骤: 开通远程推送通知 注册 Apple Developer Program: 访问 Apple Developer 并注册一个开发…...

【JavaEE进阶】CSS

本节⽬标 掌握 CSS 基本语法规范和CSS选择器的各种⽤法, 熟练使⽤CSS的常⽤属性. 一.CSS介绍 1.什么是CSS? CSS(Cascading Style Sheet),层叠样式表, ⽤于控制⻚⾯的样式. CSS 能够对⽹⻚中元素位置的排版进⾏像素级精确控制, 实现美化⻚⾯的效果. 能够做到⻚⾯…...

基于Java Springboot宠物领养救助平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...

C/C++ 中有哪些类型转换方式? 分别有什么区别?

在C编写C/C代码的时候,我们经常会遇到发生类型转换的场景,比如 赋值运算符的两个操作数不同、实参和形参类型不同、函数返回值类型和接收返回值的类型不同,都会发生类型转换;所以,在C语言中提供了两种类型转换 —— 隐…...

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代,小程序租赁系统应运而生,成为企业管理租赁业务的一种新选择。随着移动互联网的普及,越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...