【C++】6. 内联函数

news2024/11/19 5:57:20

文章目录

  • 前言
  • 一、宏函数
  • 二、内联函数
  • 三、内联函数的易错点


前言

当我们调用函数时,是有很多消耗的。其中最大的销毁就是为函数开辟空间 - 函数栈帧。
如果我们有一个函数,很短,而且要调用很多次,比如Swap()。它所造成消耗就比较大,那有没有一种方式来减少消耗?内联函数可以帮我们解决这个问题。

内联函数是在c++98引入,现在c语言的C99版本也引入了内联函数。


一、宏函数

其实在没有引入内联函数前,已经有一种方式可以解决这个问题了,即宏函数。

宏函数并非是一个函数,本质是一种替换

在这里插入图片描述

注意:宏函数的书写方式,这里不能将 ((x)+(y)) 写成 x+y
因为这会出现很多错误

  1. int c = Add(a,b) * 10 -> int c = a + b * 10 结果不正确
  2. int c = Add(a | b, a & b) -> int c = a | b + a & b +的优先级比|和&高,则计算顺序为 a | (b + a) & b

所以宏函数的括号不能随便删减,以防出现很多计算错误。


既然宏函数可以解决,那为什么还要引入内联函数呢?
因为宏函数无法调用,内联函数可以解决这个问题。


二、内联函数

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
在这里插入图片描述

在这里插入图片描述
通过汇编代码可以看到它们的区别
在这里插入图片描述


但内联函数并不是我们想要就要的,inline关键字对编译器来说只是建议,而不是强制要求。
因为,通过上面的介绍,我们知道内联函数适合以下几种情况

  1. 函数体比较短,能在调用点展开且展开后代码不会过于冗长。
  2. 函数被频繁调用,以提高执行效率。
  3. 函数不使用递归、循环、switch 等流程控制语句。

如果你的函数体很长,调用频繁,使用了递归,那此时它如果作为内联函数,编译器拒绝你的建议。
.
在这里插入图片描述


三、内联函数的易错点

别让内联函数的声明和定义分离

c和c++需要经过以下过程才能生成可执行程序。
在这里插入图片描述
具体过程如下:
在这里插入图片描述
而内联函数是不会进入符号表的,因为它不需要去链接,它是直接展开在调用的地方。
如果你将内联函数的声明和定义放在了不同的文件中,则会出现链接错误。

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

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

相关文章

机器学习笔记Python笔记:HMM(隐马尔科夫模型)

1 引子:猜天气小游戏 一对异地恋的情侣,女朋友想根据男友的心情猜测男友所在城市的天气 1.1 天气和心情一定一一对应 晴天——>高兴雨天——>烦躁 可以根据心情唯一确定天气 1.2 天气和心情没有一一对应 晴天——>80%高兴,20%烦…

有关实现深拷贝的四种方法

深拷贝与浅拷贝: 在开始之前我们需要先了解一下什么是浅拷贝和深拷贝,其实深拷贝和浅拷贝都是针对的引用类型,JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对…

Logstash学习

一、Logstash基础 1、什么是Logstash logstash是一个数据抽取工具,将数据从一个地方转移到另一个地方。下载地址:https://www.elastic.co/cn/downloads/logstash logstash之所以功能强大和流行,还与其丰富的过滤器插件是分不开的&#xff…

CDGP认证|ChatGPT的出现,对数据治理行业冲击如何?

ChatGPT的出现对数据治理有很多好处,其中最明显的是提供了更高效、更准确和更自动化的数据处理和分析服务,可以帮助企业和组织更好地管理和利用数据资源,提高数据质量和决策效率。此外,ChatGPT还能够发现隐藏在大量数据中的信息和趋势&#x…

OJ练习第82题——填充书架

填充书架 力扣链接:1105. 填充书架 题目描述 给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架…

Nexus 组件发布失败、npm 登录失败 解决过程

目录 参考发布文章进行打包 提示发布成功,但在 Nexus 里没发现组件 测试 yarn 发布 测试 npm 发布(解决登录失败) Nexus 设置 Sonatype Nexus Repository Manager 相关权限 参考发布文章进行打包 整体发布:根目录运行 yarn r…

直播软件app开发:如何保证音视频质量?

随着社交媒体的发展,视频直播已成为越来越流行的社交方式。直播软件app开发也因此成为了一个热门话题。在开发直播软件app时,保证音视频质量是至关重要的。本文将介绍如何确保你的直播软件app在音视频质量方面表现出色。 确定音视频质量标准 首先&…

第七章 建造者模式

文章目录 前言一、传统方式解决盖房子需求完整代码抽象房子类 AbstractHouse实现子类 普通房子实现子类 高楼大厦客户端盖房子 二、引入建造者模式建造者模式的四个角色: 产品、抽象建造者、具体建造者、指挥者完整代码House类 (产品角色)抽象父类(抽象建…

CV 领域的 ChatGPT?MetaAI 推出“最强”大视觉模型 SAM

出品人:Towhee 技术团队 随着 ChatGPT 引起一波又一波的“GPT热潮”,自然语言领域又一次成为了人工智能的讨论焦点。大家不由得思考,计算机视觉领域里是否会出现这样一个堪称划时代的模型?在这种万众瞩目的时候,一直处…

Python3《机器学习实战》学习笔记(七):支持向量机原理篇之手撕线性SVM

文章目录 一、SVM介绍二、线性SVM2.1 数学建模2.1.1决策面方程2.1.2"分类间隔"方程2.1.3约束条件2.1.4线性SVM优化问题基本描述2.1.5求解准备(讲讲凸函数)2.1.6拉格朗日函数2.1.7KKT条件2.1.8对偶问题求解2.1.9最后求解 2.2 SMO算法 三、代码实战3.1准备数据 一、SVM…

M_Map工具箱简介及地理图形绘制

M_Map工具箱简介及地理图形绘制 1 M_Map简介1.1 具体代码说明 2 地理图形绘制案例2.1 M_Map给定案例2.1.1 M_Map Logo2.1.2 Lambert Conformal Conic projection of North American Topography2.1.3 Stereographic projection of North Polar regions2.1.4 Colourmaps 2.2 案例…

vue封装公共组件库并发布到npm库详细教程

vue组件封装的原理:利用vue框架提供的api: Vue.use( plugin ),我们需要把封装好组件的项目打包成vue库,并提供install方法,然后发布到npm中。Vue.use( plugin )的时候会自动执行插件中的install方法。 一、组件库代码目录 目录…

常见的四种排名函数的用法(sql)

四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 1. ROW_NUMBER(排名场景推荐) 1.1 介绍 在 SQL 中,ROW_NUMBER() 是一个窗口函数,它为结果集中的每一行分配一个唯一的序号。该函数的语法如下: …

内网渗透之横向移动PTHPTTPTK

0x00前言 pass the hash(哈希传递攻击,简称pth) pass the ticket(票据传递攻击,简称ptt) pass the key(密钥传递攻击,简称ptk) PTH(pass the hash) #利用的lm或ntlm的值…

【社区图书馆】 Go佬—Go程序开发实战宝典书评

文章目录 前言内容介绍文章大致划分总结 前言 《Go 程序开发实战宝典》是一本非常实用的 Go 语言开发工具书,本书由深入浅出的案例讲解、详细的技术实现、贴近实际的应用开发等组成,非常适合 Go 语言开发爱好者、从事相关行业的工程师、技术负责人以及深…

ThinkPHP视图

ThinkPHP视图 前言视图一、运算符二、模版函数三、循环标签四,volist 循环标签五,if 判断标签六,switch 判断标签七、包含文件八、其他标签1. 条件标签2. 比较标签3. 循环标签4. 杂项标签 总结 前言 ThinkPHP视图基本语法和PHP语法非常的像,所…

React Native 9个好用的开发工具盘点

近几年在大前端的开发领域,选择跨端方案的公司和部门越来越多,曾一何时市面有不下10种跨端框架,但随着“生物进化论”的推动,目前市面上仅剩两种主流方案,就是经常听到的 React Native 和 Flutter。去年终于引来了 Rea…

企业网络安全漏洞分析及其解决_kaic

摘要 为了防范网络安全事故的发生,互联网的每个计算机用户、特别是企业网络用户,必须采取足够的安全防护措施,甚至可以说在利益均衡的情况下不惜一切代价。事实上,许多互联网用户、网管及企业老总都知道网络安全的要性,却不知道网…

《JavaEE初阶》多线程进阶

《JavaEE初阶》多线程进阶 文章目录 《JavaEE初阶》多线程进阶常见锁策略乐观锁与悲观锁普通互斥锁与读写锁轻量级锁与重量级锁自旋锁与挂起等待锁公平锁和非公平锁可重入锁和不可重入锁 CAS什么是CASCAS的应用场景:CAS 的 ABA 问题什么是CAS 的 ABA 问题解决方案: synchronize…

libxml2交叉编译和移植

编译后的libxml2如果交叉编译环境一致可以直接使用资源-CSDN文库 嵌入式开发过程中实用libxml2进行xml文件的解析、创建、使用。 这里介绍一下该libxml2的交叉编译过程和移植步骤 下载地址 libxml2 各版本下载地址 ftp://xmlsoft.org/libxml2/ ftp://xmlsoft.org/libxml2…