【C++入门】你知道C++为什么会有内联函数吗?

这篇具有很好参考价值的文章主要介绍了【C++入门】你知道C++为什么会有内联函数吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++入门】你知道C++为什么会有内联函数吗?

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


前言

本章是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。

一、问题引入

我们每次去调用函数的时候,都会有消耗(建立栈帧等等)。假设我现在要调用100次Add函数,那么就要建立100个栈帧

【C++入门】你知道C++为什么会有内联函数吗?

在C语言中,为了防止如此大的消耗,我们通常用宏函数来解决问题。宏函数的优势是在预处理阶段就会替换,不需要建立栈帧,提高调用效率。

【C++入门】你知道C++为什么会有内联函数吗?

这里就得提提宏函数书写的经典错误了 (面试常考!!!)

  1. 宏代码本身不是函数,它是一种替换,因此不需要类型
  2. 末尾不需要分号
  3. 括号问题
    ①有的人可能会这么写#define Add(x, y) x+y,那么如果有人给出这么一串代码Add(1, 1) * 2就会出现问题。原因是:宏替换后就会变成—>1 + 1 * 2,而我们期望的是先算1 + 1,然而宏替换后,根据运算符的优先级,它会先算1 * 2
    ②还有的人可能会这么写#define Add(x, y) (x+y),那么如果有人给出这么一串代码Add(a|b, a&b) 就会出现问题。原因是:宏替换后就会变成–>(a|b + a&b),所以说,它还是因为优先级的问题,我们期望是先计算出a|ba&b,然而,根据运算符的优先级,它会先算b+a
    往期回归:点击跳转

宏既然有优点,那一定就会有缺点(复杂、不易调试、代码可读性差),那就是特别容易书写写错误。因此,C++祖师爷于是自创了一个新语法 — 内联函数

二、内联函数的概念

inline修饰的函数叫做内联函数编译时C++编译器会在调用内联函数的地方展开(类似#define没有函数调用建立栈帧的开销,能提升程序运行的效率。

所以,在【问题引入】中,用内联函数表示方法如下:

只需要在函数定义前加上inline

【C++入门】你知道C++为什么会有内联函数吗?

通过以上代码,我们可以看出内联函数的优点是(解决了宏的缺点):

  1. 不需要建立栈帧
  2. 不复杂、不容易出错、可读性好、容易调试

三、内联函数的特性

有的人说,既然内联函数这么好,那可不可以将所有的函数都内联函数来表示?答案是当然不行,会导致代码膨胀(下面第一点会解释)!内联函数值适用于短小其频繁调用的函数

  1. inline是一种以空间换时间的做法。假如有一个Func函数在编译后有50行指令,假设要调用1wFunc函数,如果不使用内联函数,就会有1w+50行指令;但如果使用内联函数,在编译阶段,会用函数体替换函数调用,就会1w*50行指令,这会导致最后可执行程序(安装包)变大,谁会希望一个程序的安装包大呢?这就是代码膨胀,因此不能让所有的函数变成内联函数

  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,最终是否会称为inline,编译器自己决定

我们可以测试以上Add函数是否是内联,在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化。

【C++入门】你知道C++为什么会有内联函数吗?

以下是反汇编:

【C++入门】你知道C++为什么会有内联函数吗?

通过上图发现:并没有call Add,说明函数体替换了函数调用。

那如果在内联函数内部多加几行代码,就可能不是内联函数了。例如:

【C++入门】你知道C++为什么会有内联函数吗?

  1. inline不建议声明和定义分离

【C++入门】你知道C++为什么会有内联函数吗?

看似没错,其实程序最后会报错

【C++入门】你知道C++为什么会有内联函数吗?

这是因为:分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

所以内联函数的定义和声明一定要在一起

【C++入门】你知道C++为什么会有内联函数吗?

四、面试题

宏的优缺点?
优点:

  1. 增强代码的复用性。
  2. 提高性能。

缺点:

  1. 不方便调试宏。(因为预编译阶段进行了替换)
  2. 导致代码可读性差,可维护性差,容易误用。
  3. 没有类型安全的检查 。

C++有哪些技术替代宏?文章来源地址https://www.toymoban.com/news/detail-436604.html

  1. 常量定义换用constenum
  2. 短小函数定义换用内联函数

到了这里,关于【C++入门】你知道C++为什么会有内联函数吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么会有刷掉第一名、刷掉400+的院校?

    本期为大家整理热门院校-“南昌大学”的择校分析,这个择校分析专题会为大家结合:初试复试占比、复试录取规则(是否公平)、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源于研招网,如有错误,欢迎指正,谢谢!

    2024年02月08日
    浏览(57)
  • NFT 为什么会有差异,探索底层的铸造协议

    NFT 的流行,让许多人都对它已经不怎么陌生了。但你真正了解过它么?从表面来看,每个 NFT 之间的性质、特点以及属性和功能等都没有多大的差别,当我们深入了解时才会发现,在不同应用领域的 NFT 之间,也有一些细微的不同。是什么导致了这些差异的存在呢?这个问题

    2024年02月15日
    浏览(42)
  • 为什么会有分布式锁?分布式锁实现方案

    分布式锁是控制分布式系统之间同步访问共享资源的一种方式。分布式环境下会出现资源竞争的地方都需要分布式锁的协调。 分布式锁的作用:在整个系统提供一个全局、唯一的锁,在分布式系统中每个系统在进行相关操作的时候需要获取到该锁,才能执行相应操作。 服务

    2024年02月08日
    浏览(46)
  • 为什么会有JMM?从0到1一次性说清楚

    JMM(Java Memory Model)是一种规范,定义了在多线程环境下Java程序中的内存访问行为。JMM保证了在多线程环境下程序的正确性,同时也允许编译器和处理器对指令进行优化,以提高程序的性能。 Java线程之间的通信由Java内存模型(简称JMM)控制,从抽象的⻆度来说,JMM定义了线

    2023年04月20日
    浏览(38)
  • C++中为什么不能把所有函数都设置成虚函数?

    在面试的时候被问到一个问题,既然虚函数可以不被重写,为什么不把所有的函数都设置成虚函数? 我当时的回答是,因为对于工程来说,一个类里可能会有很多的函数,都设置成虚函数的话会有很多不必要的开销(虚函数表)。但总觉得回答不够完善,所以闲下来去了解了

    2023年04月12日
    浏览(42)
  • 【人工智能】为什么说大模型会有「幻觉」问题,又如何去解决呢

    大家好,我是全栈小5,欢迎阅读文章! 此篇是【话题达人】序列文章,这一次的话题是《如何解决大模型的幻觉问题》 先来了解基本术语和缩写全称,比如LLM。 LLM是Large Language Model的缩写,指的是一种 大规模语言模型 ,可以用来为许多自然语言处理(Natural Language Processing

    2024年02月03日
    浏览(48)
  • 【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章主要是为了解答有关多态的那篇文章那块的一个奇怪现象,大家还记得这张

    2024年02月19日
    浏览(35)
  • (快手一面)分布式系统是什么?为什么要分布式系统?分布式环境下会有哪些问题?分布式系统是如何实现事务的?

    《分布式系统原理与泛型》中这么定义分布式系统: “ 分布式系统是若干独立计算机的集合, 这些计算机对于用户来说就像单个相关系统 ”, 分布式系统(distributed system)是建立在网络之上的软件系统。 就比如:用户在使用京东这个分布式系统的时候,会感觉是在使用一

    2024年02月08日
    浏览(67)
  • 【C++学习】类和对象 | 拷贝构造 | 探索拷贝构造函数为什么需要引用传参 | 深拷贝 | 初识运算符重载

    上一篇文章我们开始学习类内的默认成员函数, 这里是传送门,有兴趣可以去看看:http://t.csdn.cn/iXdpH 这篇文章我们继续来学习类和对象的知识。 目录 写在前面: 1. 拷贝构造 2. 拷贝构造函数为什么需要引用传参? 3. 深拷贝 4. 初识运算符重载 写在最后: 我们在创建一个对

    2024年02月11日
    浏览(49)
  • 无线路由器为什么需要重启 看完你就知道

    无线路由器已经成为每个家庭中不可或缺的网络设备。使用WiFi网络,无论是上网刷微博,还是在线追剧,亦或是进行在线游戏,经常卡顿的现象是最让人受不了的。有时候WiFi连接不佳,拍两下路由器是没有效果的。我们会重启无线路由器,重启后明显会感觉的网络变得流畅

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包