内联函数详解

news2024/10/7 4:31:05

文章目录

    • 前言
    • 正文
  • 知识点一:内联
    • 1、内联函数的诞生
    • 2、内联函数概念
    • 3、内联函数的特性
    • 结语

前言

这里vince将要进入C++的学习了,C++学习将是一个漫长的过程,当然在学习这里的基础上前面的知识也不能不复习。也有很多人说C++有多难有多难的,但是我们不能胆怯,努力去学,孰能生巧,至少能够达到了解它的层次哈~
在这里插入图片描述

正文

知识点一:内联

1、内联函数的诞生

为什么C++里面会引入内联呢?
答:为了解决频繁短小函数的调用,此时会使用内联函数。
大家回想一下C语言里面怎样解决短小函数频繁调用的?
答:在C里面我们是利用宏来解决短小函数频繁调用的。

说到这里,大家可以自己尝试写一个实现宏函数吧!
例:(求和的宏函数定义)

//#define ADD(x, y) return x + y;
//#define ADD(x, y) (x + y);
//#define ADD(x, y) x + y
//以上这都是错误写法,宏函数很容易写错
//宏还不支持调试

//验证自己宏写的是否正确,就是去替换验证一下
#define ADD(x, y) ((x)+(y))   //正确写法

哈哈哈~我相信以上宏写法的这些错误,肯定有不少人犯错吧。瞧瞧这就是宏,不但写的时候复杂容易出错之外,还晦涩难懂,不易理解并且也不支持调试。

因此C++就进行改进完善,引出了内联函数,来解决宏函数晦涩难懂,容易写错的问题。


2、内联函数概念

在函数声明或者定义的时候,以关键字inline修饰的函数就叫做内联函数。
例:(求两数之和的函数inline())

#include <iostream>
using namespace std;
inline int Add(int x = 10, int y = 8)//inline修饰的Add函数
{
	return x + y;
}
int main()
{
	int ret1 = Add(8, 24);
	int ret2 = Add(2, 4);
	int ret3 = Add(5, 6);
	cout << ret1 << " " << ret2 << " " << ret3 << endl;
	return 0;
}

运行结果
在这里插入图片描述


3、内联函数的特性

.1、inline是一种以空间换时间的做法,省去调用函数额外开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。

内联函数的声明、定义和调用方法与普通函数相同,但是C++里面对他们的处理方式不同。如果一个函数被定义为内联函数,在编译的时候,C++将用内联函数的代码代替对它这个函数的每次调用。
上面main函数里面多次调用内联函数Add(),C++编译器在编译此程序的时候,会对main函数中的函数做如下处理:

int main()
{
	int ret1 = 8 + 24;
	int ret2 = 2 + 4;
	int ret3 = 5 + 6;
	cout << ret1 << " " << ret2 << " " << ret3 << endl;
	return 0;
}

这里就可以看出,在需要调用Add()函数的时候,没有去调用Add()函数,而是直接使用Add()函数中的代码逻辑实现。

我们来看看不加inline时候,就会有函数压栈的开销:(运行环境为vs2019)
下图在Debug版本下可以看到汇编代码,这里call Add就是对Add函数的调用,此时需要有函数压栈开销。
在这里插入图片描述如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
这里在Debug版本下需要配置一下环境才可以看到
在这里插入图片描述
Debug版本配置环境补充说明:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里可以看出加inline后就会去掉函数压栈开销,从而提升程序自身效率。这就是一种以空间换时间的做法。

2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。

3. inline函数的声明或定义必须在函数的调用之前完成。

例:

#include <iostream>
using namespace std;

inline int Add(int x = 10, int y = 8);//声明Add是内联函数

int Add(int x, int y)//可以在这里前面加上inline,也可以省略(声明的时候添加了),意义都相同
{
	return x + y;
}
int main()
{
	int ret = 0;
	ret = Add();
	cout << ret << endl;
	return 0;
}

分析:
该程序中,Add函数在声明的时候冠以关键字inline,而定义的时候没有冠以关键字inline,但仍是内联函数。
错误示例:

#include <iostream>
using namespace std;

int Add(int x = 10, int y = 8);//声明不给inline,Add是一个普通函数
int main()
{
	int ret = 0;
	ret = Add();
	cout << ret << endl;
	return 0;
}
inline int Add(int x, int y)//定义的时候给inline
{
	return x + y;
}

分析:
这里Add()函数在声明的时候没有给关键字inline,即声明Add()是一个普通函数,此时在main函数里面调用Add()时候,编译器就会先去找他的声明,根据声明确定它为一个普通函数,因此,尽管在定义的时候有inline但是,此时编译器也无法识别。
在这里插入图片描述

结语

vince刚刚入坑CPP,这里是CPP的一部分基础学习,好多人都说CPP最难,其实什么事对于初学者来说都难,但是只要我们能够坚持学习,就一定会有进步的哈~希望我和大家都不要放弃!。

如果各位大佬们觉得有一定帮助的话,就来个赞和收藏吧,如有不足之处也请批评指正


代码不负有心人,98加满,向前冲啊🐬

以上代码均可运行,编译环境为 vs2019哈~

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

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

相关文章

零代码—0代码—无代码平台是什么?怎么选?

那么&#xff0c;零代码平台究竟是什么&#xff1f;我们该是不是优先选择呢&#xff1f;为方便大家理解&#xff0c;本文将从零代码平台的原因、特点、优势、应用实例、局限性、选择要点六个角度分析&#xff1a;零代码平台到底是什么&#xff1f;到底适不适合你来用&#xff1…

Java理清JDK、JRE、JVM之间什么关系?如何做到一次编译到处执行的?

在理解Java基础知识或者有一定编程基础后&#xff0c;看此文章会深有体会。 JDK、JRE、JVM之间什么关系 包含关系 开发环境&#xff08;jdk&#xff09;,执行环境&#xff08;jre&#xff09; 源程序通过Javac编译成字节码文件 这个字节码文件是可以被各个操作系统通用的文…

【Nginx】在Linux上如何安装Nginx教程+Nginx基本命令的使用

目录1. Nginx下载2. 系统准备3. Nginx安装3.1 安装方式3.2 依赖准备1&#xff09;GCC编译器2&#xff09;PCRE3&#xff09;zlib4&#xff09;OpenSSL3.3 源码下载3.4 解压编译3.5 Nginx目录结构3.6 配置环境变量4. Nginx基本命令4.1 检查配置文件的正确性4.2 查看Nginx配置文件…

qt example plugandpaint 插件 动态库 pnp_extrafiltersd.dll无法加载问题

使用版本windows qt5.12.0vs2015编译器。 运行plugandpaint工程的时候发现pnp_extrafiltersd.dll在load的时候失败了&#xff0c;经过调试&#xff0c;发现qlibrary.cpp中的findPatternUnloaded()的qt_find_pattern()无法通过。&#xff08;release 版的pnp_extrafilters.dll是…

Java基础深化和提高 ---- 网络编程

网络编程基本概念 计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其 外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软 件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计 算机系统。 …

Linux系统下文件的压缩与打包

压缩和解压缩 压缩数据或者解压数据&#xff1a; 为什么要移出数据信息前面的 / 目录 -P --absolute-paths 不要从文件名中去除 /1 compress和uncompress 格式 compress Options [file ...]常用选项 -d 解压缩&#xff0c;相当于uncompress-c 结果输出至标准输出…

Spring 事务失效的场景

1、private、final、static 方法 被 Transactional 注解标注的方法的访问权限必须是 public&#xff1b; 被 Transactional 注解标注的方法不能被 final、static 修饰&#xff0c;被标注的方法必须是可覆盖的。这是因为事务底层使用的是 aop&#xff0c;而 aop 使用的是代理模…

嵌入式为何钟爱SourceInsight,主要因为这个功能~

已剪辑自: https://mp.weixin.qq.com/s/F-gafwbZswpnY8EaCz8HxQ 不管是玩单片机还是嵌入式linux&#xff0c;只要是与硬件结合比较紧密的部分目前基本上还是C语言&#xff0c;当然了&#xff0c;不知道以后C语言会不会被取代&#xff0c;即便哪天被某种更加优秀的语言取代&…

m基于matlab的MIMO信道容量分析,对比了不同天线数量;非码本预编码SVD,GMD;码本预编码DFT,TxAA以及空间分集

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 MIMO信道容量 平均功率分配的MIMO信道容量&#xff1a;通过Matlab仿真在加性高斯白噪声情况下的SISO (1*1)、SIMO(1*6)、MISO(4*1)、MIMO(3*3)、MIMO&#xff08;4*4&#xff09;系统的…

VMware Explore 2022 China,赋能中国企业加速实现云智能

全球领先的企业软件创新者VMware&#xff08;NYSE: VMW&#xff09;的年度技术盛会—— VMware Explore 2022 China于11月8日正式举行。本届大会以“探索多云宇宙”为主题&#xff0c;汇聚云计算领域的顶尖技术专家和创新者&#xff0c;通过150多场解决方案演讲、围绕云基础架构…

[附源码]Python计算机毕业设计超市团购平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

JuiceFS 使用效果及注意事项

以某线上集群为例&#xff0c;数据规模&#xff1a;每天写入 5TB&#xff0c;数据储存 30 天&#xff0c;热数据储存一周&#xff0c;节点数量&#xff1a;5 个热节点&#xff0c;15 个冷节点。 采用 JuiceFS 后&#xff0c;热节点保持不变&#xff0c;冷节点从 15 个降到了 1…

[b01lers2020]Life on Mars (难发现的sql注入)

[b01lers2020]Life on Mars 打开界面以后&#xff0c;查看各种都没有提示&#xff0c;果断扫描目录&#xff0c;但也是没获得什么。 到这里只能burp抓个包看看 抓包两个界面发现了get传参&#xff0c;考虑是否存在sql注入 尝试额以后发现只返回了一个1&#xff0c;试一下别的引…

Nginx显示500错误原因和解决方法

文章目录1.背景2.Nginx 常见的几种报错3. 解决500错误1.背景 最近在操作nginx 的时候出现了 Nginx 500 内部错误&#xff0c;在此记录一下原因&#xff0c;项目采用的是前后端分离方式&#xff0c;后端SpringBoot &#xff0c;前端是Vue 部署到Nginx 下。 2.Nginx 常见的几种…

从水质监测运维工程师转行软件测试,武汉校区小哥哥除了收获10k高薪,还有...

从大学步入社会&#xff0c;每个人都会面临角色和身份的转变&#xff0c;大部分同学对此充满信心和期待&#xff0c;仿佛有用不完的精力、耗不尽的热情。可是社会中的磨砺也让心态慢慢变得成熟&#xff0c;生活、文化等方面的落差显现出来&#xff0c;想要做出改变&#xff0c;…

java项目-第151期ssm文物管理系统_java毕业设计_计算机毕业设计

java项目-第151期ssm文物管理系统_java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm文物管理系统》 该项目分为2个角色&#xff0c;管理员、用户。 用户可以浏览前台文物信息、论坛交流、文物资讯、留言反馈。 管理员负责登录后台系统&#xff0c…

[附源码]java毕业设计校医院病人跟踪治疗信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

产品质量模型

产品质量模型将系统/软件产品质量属性划分为8个特征&#xff1a;功能性、性能效率、兼容性、易用性、可靠性、安全性、可维护性、可移植性&#xff0c;每个特征由一组相关子特征组成。 衡量一个优秀软件的维度&#xff1a; 产品质量模型只应用于软件产品&#xff0c;或者包含软…

从零开始做一款Unity3D游戏<三>——编写游戏机制

添加跳跃 了解枚举 使用层遮罩 发射投射物 实例化对象 管理游戏对象的创建 游戏管理器 维护玩家属性 get和set属性 精益求精 图形用户界面 胜败条件 使用预编译指定和命令空间 总结 前面一章&#xff0c;我们专注于通过代码来移动玩家和相机&#xff0c;同时了解了…

深入理解计算机系统——Midterm Exam 2012

深入理解计算机系统——Midterm Exam 2012Problem 4 疑问Problem 6 疑问Problem 7 疑问Problem 8 疑问试卷&#xff1a;Midterm Exam 2012 答案&#xff1a;Exam Solutions Problem 4 疑问 第 4 题为第三章内容&#xff0c;这里觉得题目有一步骤写错了&#xff0c;<13> …