【C++】内联函数理解

news2025/3/1 22:02:58

内联函数

内联函数的使用是对于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.coloradmin.cn/o/412346.html

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

相关文章

银行数字化转型导师坚鹏:金融数据治理、数据安全政策解读

金融数据治理、数据安全政策解读及大数据应用课程背景: 很多银行存在以下问题: 不知道如何准确理解金融数据治理及数据安全相关政策 不清楚金融数据治理及数据安全相关政策对银行有什么影响? 不清楚如何有效应用金融数据治理及数据安全相关…

软考软件设计师 下午试题二笔记

E-R图基本图形元素 实体 一个实体的存在要以另一个实体存在为前提,这个就是弱实体,比如家属和职工,家属的存在就是依赖于职工 属性 属性带下划线的是主键 联系 三个实体之间的联系 试题二问题一例题 问题二 将er图转成关系模式就是问题二答…

Cell Discovery:人类特异基因促进大脑皮层折叠新机制

在人类进化过程中,新皮层的扩张与智力的提高和认知功能的改善密切相关。这种扩张的一个关键方面是大脑皮层沟回的形成,它使扩张的皮质表面积能够适应有限的颅骨空间。这些进化特征主要依赖于多种神经干细胞和祖细胞亚型及其神经源性分裂产生的更多数量的…

《计算机网络-自顶向下》05. 网络层-控制平面

文章目录路由控制方式每路由控制逻辑集中式控制路由选择算法LS —— 链路状态路由选择算法DV —— 距离向量路由选择算法LS 和 DV 算法的比较自治系统内部路由协议RIPOSPF自治系统外部路由协议:BGP通告 BGP 路由信息选择最好的路由相关术语热土豆选择路由选择算法&a…

Swagger教程

Swagger 目标 Swagger简介【了解】 Springboot整合swagger【掌握】 Swagger 常用注解【掌握】 一、Swagger简介 ​ Swagger 是一系列 RESTful API 的工具,通过 Swagger 可以获得项目的⼀种交互式文档,客户端 SDK 的自 动生成等功能。 ​ Swagger …

TryHackMe-Year of the Owl(Windows渗透测试)

Year of the Owl 当迷宫在你面前,你迷失了方向时,有时跳墙思考是前进的方向。 端口扫描 循例 nmap SMB枚举 smbmap enum4linux也什么都没有 Web枚举 80端口 gobuster扫到一堆403,并没有什么有用的信息 443端口与80端口一致 47001端口依…

【SQL】公网远程访问局域网SQL Server数据库【无公网IP内网穿透】

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 转发自CSDN远程穿透的文章:[无需公网IP&am…

详解以太坊

以太坊原理 以太坊通过建立终极的抽象的基础层-内置有图灵完备编程语言的区块链-使得任何人都能够创建合约和去中心化应用,并在其中设立他们自由定义的所有权规则、交易方式和状态转换函数。 图灵完备:能够运行非常复杂的运算,最简单的理解…

基于共享储能电站的工业用户日前优化经济调度

目录 1 主要内容 共享电站示意图 目标函数 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序方法复现《基于共享储能电站的工业用户日前优化经济调度》算例2和算例3,根据共享储能电站的商业运营模式,将共享储能电站应用到工业用户经济优化调度…

〖Python网络爬虫实战⑨〗- 正则表达式基本原理

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…

【Linux】用户命令(创建,修改,切换,删除,密码)

目录 1.创建 查看用户信息 查看id 2.修改 修改用户名 修改用户uid 操作前: 操作后 修改组名 操作前: 操作后: 修改组id 操作前: 操作后: 操作前: 操作后: 3.切换用户 4.删除 操作前: 操作…

如何在Spring Boot中使用Spring MVC

目录 1.MVC 2.Spring MVC 3.Spring Boot中使用Spring MVC 3.1.配置 3.1.1.文件配置 3.1.2.代码配置 3.2.使用 3.2.1.映射处理器 3.2.2.传参 3.2.3.参数转换 3.2.4.数据校验 3.2.5.数据模型 3.2.6.视图和解析器 3.2.7.拦截器 1.MVC MVC 是一种常见的软件设计模式…

企业级信息系统开发讲课笔记2.4 利用MyBatis实现条件查询

文章目录零、本节学习目标一、查询需求二、打开MyBatisDemo项目三、对学生表实现条件查询(一)创建学生映射器配置文件(二)在MyBatis配置文件里注册学生映射器配置文件(三)创建学生映射器接口(四…

macOS Ventura 13.3.1 (22E261) Boot ISO 原版可引导镜像

本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 Linux 中创建可引导介质。 macOS Ventura 13.3.1 为 Mac 提供下…

os库的使用与第三方库安装脚本

os库基本介绍 os 顾名思义,就是与操作系统相关的标准库。如:文件,目录,执行系统命令等。 os库是Python标准库,包含几百个函数 常用路径操作、进程管理、环境参数等几类 路径操作:os.path子库&#xff0…

安捷伦34970A

18320918653 34970A Agilent 34970A 数据采集器|安捷伦数据采集器|34970A 您可信任的测量: 我们把销售良好数字多用表测量引擎嵌入在3槽主机箱中。您能获得优异的测量能力,带有内置信号调整的通用输入,模块化的灵活性,低廉的售…

Ubuntu20.04配置CuckooSandbox环境

Ubuntu20.04配置CuckooSandbox环境 因为最近要做恶意软件分析,阅读论文发现动态分析的效果普遍比静态分析的效果要好一些,所以需要搭建一个动态分析的环境,查阅资料发现Cuckoo Sandbox是不错的自动化分析环境,但是搭建起来还是比…

机器学习相关建议

1、开发机器学习系统或者优化的路径 训练数据量的增加对机器学习系统的影响增加特征集或减少特征集改变正则化参数尝试增加多项式特征 | 高偏差、欠拟合 | 高方差、过拟合 | | ------------------ | ------------------------------ | | 尝试增加多项式特征 | 尝试减少特征的数…

30-60K,转型云原生架构师和SRE需要哪些能力?

你好,我是王炜,欢迎和我一起学习云原生的核心技术。 先来简单介绍一下我自己吧。作为前腾讯云 CODING 架构师,现在深圳氦三科技的联合创始人,同时也是中国云原生社区深圳站的负责人,我见证了云原生在国内从萌芽到蓬勃…

【k8s完整实战教程6】完整实践-部署一个federated_download项目

系列文章:这个系列已完结,如对您有帮助,求点赞收藏评论。 读者寄语:再小的帆,也能远航! 【k8s完整实战教程0】前言【k8s完整实战教程1】源码管理-Coding【k8s完整实战教程2】腾讯云搭建k8s托管集群【k8s完…