什么是C++内联函数,它的作用是什么?以及和宏定义的区别

内联函数定义

内联函数是在 C++ 中定义的一种特殊类型的函数。通过使用 inline 关键字,请求编译器在每个调用点直接插入函数体的代码,没有函数压栈(函数压栈:在函数调用的时候将函数的相关信息和局部变量等数据储存在栈上的过程),而不是进行常规的函数调用。这可以提高性能,因为省去了函数调用的开销,例如参数传递和返回地址的保存。

函数代码过长,不适合成为内联函数,(调用内联函数(A)的那个函数(B)本身代码很短,调用内联函数很有必要)

局部变量的存储空间通常位于栈帧(栈帧是每个函数调用所使用的栈空间)每个函数的调用都会创建一个新的栈帧,用于储存函数的局部变量,参数和其他相关信息。栈帧的创建和销毁由编译器自动管理的,确保函数调用的正确性和局部变量的安全性,栈的管理是由编译器和操作系统来完成的,

如果是一个几十行的函数,函数本身执行时就很耗时,那调用函数,创建栈帧(每个栈帧对应着一个未运行完的函数,栈帧中保存了该函数的返回地址和局部变量,其实就是函数运行时开辟的函数栈)的一两行可以忽略不计;但是如果一个函数本身就一两行,因为调用函数本身而产生的那一部分消耗,就格外突出,而宏或者内联的提前替换就显得格外优秀,提高了效率。

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

在这个例子中,add 函数被标记为内联函数。它接收两个整数并返回它们的和。假设我们在程序中多次调用 add 函数,编译器会将这些调用直接替换为 a + b 的表达式。

作用

  1. 提高程序执行效率

    内联函数可以减少函数调用的开销,特别是对于那些简单、频繁调用的函数。例如,对于短小的计算函数,直接插入代码可以提升性能。
  2. 减少代码冗余

    内联函数允许在多个地方使用相同的代码,而不需要多次复制粘贴。在代码中只需定义一次,可以在任意多个位置调用。
  3. 优化小型函数

    对于小型的、简单的函数,编译器通常会选择将其作为内联函数,从而避免函数调用带来的性能损失。
  4. 增强可读性

    内联函数可以使代码更简洁易懂,避免在复杂逻辑中频繁使用宏,而宏在调试和维护时很麻烦。

 

 特点

1.inline是一种以空间换时间的做法,省去调用函数,建立栈帧的额外开销,但是代码很长(一般是10行左右,具体取决于编译器),或者有递归函数,所以即使函数前面声明了inline,那么编译器也不会让该函数成为内联函数。

2.inline对于编译器而言只是一个建议,编译器会自动优化,如果定义的函数很长或者递归函数等等,编译器优化时会自动忽略内联。

3.inline不可以声明和定义分离,.h文件使用内联函数.cpp文件中不使用inline定义函数,会报链接错误。

如何使用内联函数 

一般来说,内联函数适合用于:短小、频繁调用且执行的函数,例如:

inline int max(int a, int b) {  return (a > b) ? a : b;  
}

在说一下宏定义。

  • 宏是由预处理器定义的,使用 #define 进行定义。
  • 宏在编译过程中进行文本替换,不进行任何语义检查,预处理器简单地将宏名替换为其定义的内容。

 

宏的缺点

#include<iostream>
using namespace std;
#define ADD(x,y) ((x)+(y))
#define ADD_One(x,y) (x*Y)int main()
{cout<<"ADD("asd",1)"<<endl;//宏定义没有类型检查 此行代码出现错误 数据类型不同cout<<ADD_One(1+2,3+4);//宏定义有二义性
}

 

内联函数和宏的区别

属性内联函数
类型检查有类型检查,遵循 C++ 的类型规则无类型检查,可能导致类型不匹配错误
作用域拥有明确的作用域,遵循 C++ 的作用域规则全局有效,可能导致命名冲突
调试可以使用调试工具调试,观察调用栈难以调试,很难跟踪替换的宏
代码可读性可读性较高,使用标准函数语法可读性较低,复杂的宏定义可能难以理解
递归可以定义递归算法不能定义递归
性能增加函数调用效率,尤其是在小型函数中直接文本替换,性能上没有明显差异,通常更快
内联函数示例宏示例
```cpp```cpp
inline int square(int x) {#define SQUARE(x) ((x) * (x))
return x * x;
}

内联函数提供了比宏更安全和更灵活的方式来进行代码的复用,适用于需要类型安全和作用域管理的场景。

虽然效率稍高,但因为缺乏类型检查和作用域,使得其在复杂代码中的使用风险较高。

 

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

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

相关文章

工业生产安全-安全帽第一篇-opencv及java开发环境搭建

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…

详细的oracle rac维护命令集合

一、查看命令 所有实例和服务的状态 $srvctl status database -d orcl Instance orcl1 is running on node db1 Instance orcl2 is running on node db2 单个实例的状态 $ srvctl status instance -d orcl -i orcl2 Instance orcl2 is running on node db2 单个节点的应用程序…

fastadmin多个表crud连表操作步骤

1、crud命令 php think crud -t xq_user_credential -u 1 -c credential -i voucher_type,nickname,user_id,voucher_url,status,time --forcetrue2、修改控制器controller文件 <?phpnamespace app\admin\controller;use app\common\controller\Backend;/*** 凭证信息…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-26

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

Essential Cell Biology--Fifth Edition--Chapter one (8)

1.1.4.6 The Cytoskeleton [细胞骨架] Is Responsible for Directed Cell Movements 细胞质基液不仅仅是一种无结构的化学物质和细胞器的混合物[soup]。在电子显微镜下&#xff0c;我们可以看到真核细胞的细胞质基液是由长而细的丝交叉而成的。通常[Frequently]&#xff0c;可…

RK3568 Linux 系统加系统运行指示灯

一、dts配置 gpio-leds {status = "okay";compatible = "gpio-leds";work-led {gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>

C++11(六)----包装器function和bind

文章目录 包装器&#xff1a;function包装器&#xff1a;bind 包装器&#xff1a;function function接口介绍 在头文件<functional>中 语法&#xff1a;function的语法比较特殊 function<返回值(参数)> 自定义变量名 要被包装的可调用对象 class Plus { public:…

店铺推推-项目测试用例设计(Xmind)

项目介绍&#xff1a; 技术栈: Spring BootMyBatisRedis项目描述&#xff1a; 项目旨在为消费者提供一个公平、公开、透明的平台&#xff0c;让消费者能够基于真实的消费体验对店铺进行评价和 推荐&#xff0c;并为其他潜在消费者提供参考。同时&#xff0c;店铺推推也是为商家…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例&#xff1a;2.2: find和erase使⽤样例&#xff1a; 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…

GIS融合之路(八)-如何用Cesium直接加载OSGB文件(不用转换成3dtiles)

系列传送门&#xff1a; 山海鲸可视化&#xff1a;GIS融合之路&#xff08;一&#xff09;技术选型CesiumJS/loaders.gl/iTowns? 山海鲸可视化&#xff1a;GIS融合之路&#xff08;二&#xff09;CesiumJS和ThreeJS深度缓冲区整合 山海鲸可视化&#xff1a;GIS融合之路&…

cooper+隐含数+2元cooper

发现群里一个题&#xff0c;应该是几天前一个比赛的。作了一下午。 from Crypto.Util.number import * import os from hashlib import * from random import * p getPrime(512) q getPrime(512) n p*q m bytes_to_long(os.urandom(20)) x pow(m,p,n) y pow(m,q,n)with…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…

word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行

注&#xff1a;本文为 “word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行” 相关专题文章合辑。 未整理去重。 “公式较长时最好在等号 “&#xff1d;” 处转行&#xff0c;如难实现&#xff0c;则可在&#xff0b;、&#xff0d;、、 运算符号处…

【优选算法 — 滑动窗口】串联所有单词的子串 最小覆盖子串

串联所有单词的子串 串联所有单词的子串 题目描述 题目解析 算法原理 以示例一为例&#xff0c;一定要记得&#xff0c;words中的每一个字符串长度相同&#xff0c;所以我们可以根据 words 中的每一个字符串的长度length&#xff0c;将 s 这个字符串以 length 个为一组来…

了解 Solon MVC 的参数注入规则

关于 Solon MVC 参数注入&#xff0c;主要尊守以下基本规则&#xff1a; 参数名与请求数据名一一对应。当对上不上时&#xff0c;会采用整体数据注入&#xff08;如果接收的是实体&#xff09;参数名与请求数据同名时&#xff0c;又想整体注入&#xff08;如果接收的是实体&am…

[SpB]如何开始使用 Spring Boot?

如何开始使用 Spring Boot&#xff1f; Spring Boot 简化了 Java 项目开发&#xff0c;你只需要专注于业务逻辑&#xff0c;底层的很多配置和功能由 Spring Boot 自动帮你处理。下面是你如何快速上手 Spring Boot 的步骤&#xff0c;以及如何通过 IDEA 了解 Spring Boot 的功能…

vue如何实现组件切换

一、使用条件渲染 (v-if) <template><div><button click"currentView ComponentA">Show Component A</button><button click"currentView ComponentB">Show Component B</button><component-a v-if"curren…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

SHELL(4)脚本与用户交互以及if条件判断

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…