C++ 内联函数

一、内联函数

函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。

一个 C/C++程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来结束自己的生命,从而结束整个程序。

函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。

如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。

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

二、内联函数的作用

  • 提高程序执行效率:对于一些功能简单、代码短小且被频繁调用的函数,使用内联函数可以减少函数调用的开销。因为每次函数调用都需要进行一系列的操作,如保存当前函数的上下文、参数传递、跳转到函数地址执行、返回结果等,而内联函数直接将代码展开在调用处,避免了这些额外的开销,从而提高程序的运行速度。
  • 增强代码的可读性:内联函数将函数体直接嵌入到调用处,使得代码的逻辑更加清晰,尤其是对于一些简单的操作,阅读代码的人可以直接看到函数的具体实现,而不需要跳转到函数定义处去查看。

三、内联函数与普通函数的区别

内联函数普通函数
函数调用方式在编译时将函数体直接插入到调用处,不进行函数调用的常规操作通过函数调用指令,在运行时跳转到函数地址执行,执行完毕后返回调用处
执行效率对于短小简单且频繁调用的函数,可减少函数调用开销,提高执行效率每次调用都有额外的开销,如压栈、跳转等,相对效率较低,但对于复杂逻辑或不频繁调用的函数影响不大
代码膨胀函数体被多次插入到调用处,可能导致代码体积增大只有一份函数代码,无论被调用多少次,代码体积不变
适用场景函数体短小简单、执行频繁的情况,如获取和设置类的成员变量的简单操作等函数体复杂、执行不频繁,或者函数体较大的情况

四、内联函数的定义和使用方法

  • 定义内联函数:如前文所述,在函数声明或定义前加上关键字inline即可定义一个内联函数。既可以在函数声明时添加inline关键字,也可以在函数定义时添加,例如:
// 函数声明为内联函数
inline int max(int a, int b); // 函数定义为内联函数
inline int max(int a, int b) {return (a > b)? a : b;
}

调用

int main() {int num1 = 5, num2 = 10;int result = max(num1, num2);return 0;
}

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java Springboot校园疫情防控系统

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

《探索 Spring 核心容器:Bean 的奇妙世界》

一、Spring 核心容器与 Bean 的关系 Spring 核心容器是 Spring 框架的重要组成部分,负责管理和组织应用程序中的对象,而 Bean 则是构成应用程序主干并由 Spring IoC 容器管理的对象,二者紧密相连。 Spring 的核心容器由多个模块组成&#xf…

基于卷积神经网络的航空发动机剩余寿命预测Matlab实现

本文利用NASA提供的涡扇发动机退化数据集,进行数据预处理,构建训练样本和测试样本,然后搭建卷积神经网络(Convolutional Neural Network,CNN),学习训练数据,最后利用测试数据,分析神…

day02(单片机高级)单片机控制ESP8266连接阿里云

目录 单片机控制ESP8266连接阿里云物联平台 MQTT协议简介 订阅和发布 cJSON简介 云平台搭建 注册和登录 实例的开通和创建 产品和设备的创建 创建产品 添加设备 功能定义 发布上线 MQTTFX工具使用 发布和订阅 订阅 发布 MQTT固件烧录 AT指令验证 调试验证订阅 单片机控制ESP826…

社交电商的优势及其与 AI 智能名片小程序、S2B2C 商城系统的融合发展

摘要:本文深入分析了社交电商相较于传统电商的优势,包括门槛低、易操作、更生活化和可团队化运作等特点。同时,探讨了 AI 智能名片小程序和 S2B2C 商城系统在社交电商发展中的作用,以及它们与社交电商融合所带来的新机遇和发展前景…

uni-app快速入门(八)--常用内置组件(上)

uni-app提供了一套基础组件&#xff0c;类似HTML里的标签元素&#xff0c;不推荐在uni-app中使用使用div等HTML标签。在uni-app中&#xff0c;对应<div>的标签是view&#xff0c;对应<span>的是text&#xff0c;对应<a>的是navigator&#xff0c;常用uni-app…

Jmeter的后置处理器(二)

5--JSR223 PostProcessor 功能特点 自定义后处理逻辑&#xff1a;使用脚本语言编写自定义的后处理逻辑。支持多种脚本语言&#xff1a;支持 Groovy、JavaScript、BeanShell 等脚本语言。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。灵活性高…

基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段

一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时&#xff0c;为了实现通用的CURD&#xff0c;在定义实体类pojo时&#xff0c;会尽量将能用得上的数据库字段都定义到 pojo中&#xff0c;但是在查询的时候却有不一样的需求。mybatis的文档地址链接&#xff…

SLAM-evo 评估

文章目录 1.evo介绍1.1.evo安装1.1.2.evo的安装(evo共有两种安装方式)1.1.2.1.采用pip安装&#xff0c;直接安装最新的稳定发行版&#xff08;在翻墙的情况下可以使用&#xff09;将路径添加到系统 PATH 中1.1.2.2.源码安装 &#xff0c;下载源码进行安装&#xff08;必须翻墙&…

【机器学习chp3】判别式分类器:线性判别函数、线性分类器、广义线性分类器、分段线性分类器

前言&#xff1a; 本文遗留问题&#xff1a;&#xff08;1&#xff09;对最小平方误差分类器的理解不清晰.&#xff08;2&#xff09;分段线性判别函数的局部训练法理解不清晰。 推荐文章1&#xff0c;其中有关于感知机的分析 【王木头从感知机到神经网络】-CSDN博客 推荐文…

04 搭建linux驱动开发环境

虽然 petalinux 功能很全面&#xff0c;但是其编译速度较慢&#xff0c;不适用于驱动调试阶段&#xff08;因为驱动调试阶段会频繁修改驱动模块、内核、设备树等&#xff09;&#xff0c;因此本章将采用分步编译的方式来编译启动开发板所需要的各种镜像文件&#xff0c;虽然步骤…

Linux性能优化之火焰图的起源

Linux火焰图的起源与性能优化专家 Brendan Gregg 密切相关&#xff0c;他在 2011 年首次提出这一工具&#xff0c;用于解决性能分析过程中可视化和数据解读的难题。 1. 背景&#xff1a;性能优化的需求 在现代计算中&#xff0c;性能优化往往需要对程序执行中的热点和瓶颈进行…

半桥驱动芯片调试中的问题

结论&#xff1a;低于12V的场景应用分立的MOS驱动电路压根不合适&#xff0c;选用集成桥臂的芯片合适。 HIN的输入电平不能是长时间的高电平&#xff0c;否则自举电容没法充放电从而没办法自举升压&#xff0c;上管无法控制&#xff1a; 电容C2的容值应该尽可能大&#xff…

【C++】类和对象-深度剖析默认成员函数-上

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

RabbitMQ黑马笔记

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 3.SpringAMQP 3.1.Basic Queu…

麒麟KylinServer的网站,并部署一套主从DNS服务器提供域名解析服务

一、KylinServer网站搭建 ifconfig Copy 注意:根据实际网卡设备名称情况调整代码!不同环境下网卡名称略有不同! 获取本机IP地址,记住IP地址用于之后的配置填写。 ifconfig enp0s2 Copy 下载nginx源码包,并解压缩 wget http://10.44.16.102:60000/allfiles/Kylin/ng…

解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL&#xff0c;可以先做检查连接&#xff1a;

AWTK-WIDGET-WEB-VIEW 发布

awtk-widget-web-view 是通过 webview 提供的接口&#xff0c;实现的 AWTK 自定义控件&#xff0c;使得 AWTK 可以方便的显示 web 页面。 项目网址&#xff1a; https://gitee.com/zlgopen/awtk-widget-web-view webview 提供了一个跨平台的 webview 接口&#xff0c;是一个非…

Pandas教程之Pandas 简介

Pandas 简介 接下来一段时间&#xff0c;我会持续发布并完成Pandas教程 Pandas 是一个功能强大的开源 Python 库。Pandas 库用于数据操作和分析。Pandas 由数据结构和函数组成&#xff0c;可对数据执行有效的操作。 本免费教程将概述 Pandas&#xff0c;涵盖 Python Pandas 的基…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…