【C++】内联函数----inline函数的详细使用教程

这篇具有很好参考价值的文章主要介绍了【C++】内联函数----inline函数的详细使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟
👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏


前言

今天我们来学习C++中的一个比较重要的关键字–inline函数(内联函数),码字不易,希望多多支持!!!
【C++】内联函数----inline函数的详细使用教程

——————————————————————————————

概念:

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

出现动机:

减少函数栈帧的开辟和销毁,如当频繁调用一个函数的时候(比如快排算法中函数多次被调用),此时消耗栈帧的比较大(不断地调用栈帧销毁栈帧)。
因此要将函数栈帧的优化掉

C语言的解决方案:宏函数

对于C语言中,可以使用宏函数。
使用宏函数为什么没有函数栈帧的消耗???
因为在预处理阶段就被替换了----优化了,没有了函数的栈帧的消耗了

新方案:C++方案—内联函数

有些人可能会比较疑惑:C语言中已经有方案了,为什么C++为什么还要再设计一个关建字方案:
因为宏函数有很多不方便的地方:

  1. 不可以调试
  2. 没有类型安全检查
  3. 容易写错
    比如你可以写一个ADD宏函数来验证:
#define ADD(int x, int y) {return x + y;}
#define ADD(x, y) x + y
#define ADD(x, y) (x + y)
#define ADD(x, y) (x) + (y)
#define ADD(x, y) ((x) + (y));

这五种写法都是很有可能是你写出来的(最后一个是对的,其余全是错的)
这几个宏定义的写法都是错误的,具体原因如下:

  1. #define ADD(int x, int y) {return x + y;}

该写法定义了一个带有参数列表的宏,但是参数列表应该在括号内,而不是放在宏名后面即ADD(int x, int y),正确的定义应该是:

#define ADD(x, y) {return x + y;}
  1. #define ADD(x, y) x + y

该写法没有使用括号把宏展开式中的参数括起来,可能会导致运算顺序出现问题。比如:

int result = 2 * ADD(3, 4);

在展开后就变成了 int result = 2 * 3 + 4; 发生了预期外的错误。 正确写法应该是:

#define ADD(x, y) ((x) + (y))
  1. #define ADD(x, y) (x + y)

该写法同样没有使用括号将宏展开式中的参数括起来,同样可能导致运算次序出现问题。比如:

int result = 2 * ADD(3, 4);

等价于 int result = 2 * (3 + 4); 发生了预期外的错误。正确写法应该是:

#define ADD(x, y) ((x) + (y))
  1. #define ADD(x, y) (x) + (y)

该写法看似使用括号将宏展开式中的参数括起来,但是由于缺少返回值表达式,比如return关键字,可能导致编译错误,语法上存在问题。 正确写法应该是:

#define ADD(x, y) ((x) + (y))

总而言之,在定义宏时,需要注意参数列表和展开式的正确书写,以及是否需要

总结:

【C++】内联函数----inline函数的详细使用教程
因此宏函数极易出现错误。
这个知识点容易出错,但是面试的时候易被问到。

内联函数替代宏函数

在函数返回值前加一个inline即可, 那么函数就会在调用位置直接展开:
【C++】内联函数----inline函数的详细使用教程

可以通过vs2013编译器上通过反汇编进行查看这个:
查看方式:

  1. 在release模式下,查看编译器生成的汇编代码中是否存在call Add
  2. 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)debug模式下不展开是因为为了支持调试!!!
    【C++】内联函数----inline函数的详细使用教程
    【C++】内联函数----inline函数的详细使用教程

特性:

以空间换时间

inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

内联函数只是一个请求:

【C++】内联函数----inline函数的详细使用教程

inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为
《C++prime》第五版关于inline的建议:
【C++】内联函数----inline函数的详细使用教程

适用范围

经验条款:C++中用Inline,const,enum来替换宏
【C++】内联函数----inline函数的详细使用教程
适用范围:频繁调用小函数的时候:
【C++】内联函数----inline函数的详细使用教程
但是内联函数是一个请求,不一定展开,当你频繁调用大函数的时候(干一些坏事情)编译器不会展开。
编译器有自己的规则,不喜欢你多管,hh
【C++】内联函数----inline函数的详细使用教程
【C++】内联函数----inline函数的详细使用教程

再举个栗子:代码膨胀

【C++】内联函数----inline函数的详细使用教程
指令影响的是什么-----安装包
【C++】内联函数----inline函数的详细使用教程
安装包大了–必然不好

inline不建议声明和定义分离:

inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

举个栗子:

正常情况(预处理-编译-链接)

【C++】内联函数----inline函数的详细使用教程

预处理:

首先编译器会对这个代码进行预处理,变成这个样子:即将所应用的头文件的内容放到文件内----
【C++】内联函数----inline函数的详细使用教程

编译:

接下来进行代码的编译:
【C++】内联函数----inline函数的详细使用教程
编译的时候将代码转换为汇编指令:此时我们可以看到Test.cpp文件中call的func函数的函数地址是未知的,正常情况是会在链接的时候在符号表中查找并将函数地址填入进行调用。

链接:

【C++】内联函数----inline函数的详细使用教程
上面是正常的情况,下面说一下,当Inline函数调用和声明分离的时候:

内联情况:
预处理:

【C++】内联函数----inline函数的详细使用教程

编译:

【C++】内联函数----inline函数的详细使用教程
stack.cpp文件内不会生成指令,因为没有调用

链接:

【C++】内联函数----inline函数的详细使用教程

建议:

直接在.h文件内定义就行了

总结:

【C++】内联函数----inline函数的详细使用教程
只要是内联函数,函数定义与声明分离的时候,内联函数的函数地址不会进符号表,要不然还要判断编译器是否应用内联函数,这样太复杂了!!!

【C++】内联函数----inline函数的详细使用教程
【C++】内联函数----inline函数的详细使用教程

注意事项:

宏的优缺点?

优点:

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

缺点:

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

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

长不用,短用内联函数。


最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。

3.成年人的世界,只筛选,不教育。

4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。

5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!
文章来源地址https://www.toymoban.com/news/detail-444646.html

到了这里,关于【C++】内联函数----inline函数的详细使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C++学习手札】-引用与内联函数以及C++中对const拓展详解(超详细!)

                                           食用指南:本文在有C基础的情况下食用更佳                                        🔥 这就不得不推荐此专栏了:C语言                                        🍀 内联函数前置知识 :宏函数

    2024年02月14日
    浏览(27)
  • 【跟小嘉学 Rust 编程】二十四、内联汇编(inline assembly)

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月10日
    浏览(38)
  • 23:kotlin类和对象 -- 内联值类(Inline value classes)

    有时,将一个值包装在一个类中可以创建一个更具领域特定类型的类。然而,由于额外的堆分配,这会引入运行时开销。此外,如果包装的类型是原始类型,性能损失是显著的,因为原始类型通常由运行时进行了大量优化,而它们的包装类没有得到任何特殊处理。 为了解决这

    2024年02月03日
    浏览(30)
  • 【C++】函数重载 & 引用 & 内联函数

    目录 一,函数重载 1,函数重载的概念 2,C++支持函数重载的原理 二,引用 1,引用概念 2,引用特性 3,常引用 4,做参数 5,做返回值 6,传值、传引用效率比较 7,值和引用的作为返回值类型的性能比较 8,引用和指针的区别 三,内联函数 1,概念 2,特性 自然语言中,一个

    2024年02月08日
    浏览(27)
  • 【C++入门】内联函数

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】 内联函数概念: 内联函数就是以inline修饰的函数叫做内联函数,编译时会在调用内联函数的地方展开,没有函数调用占用建立栈帧的开销。 我们知道函数的

    2024年02月01日
    浏览(34)
  • C++内联函数详解

    目录 如何定义内联函数? 内联函数的优势 内联函数的缺点 内联函数的使用场景 示例代码 总结 在C++中,内联函数是一种特殊的函数,它的作用是在程序编译时将函数的代码直接嵌入到调用该函数的代码中,从而避免了函数调用的开销。这种方式可以提高程序的执行效率,适

    2023年04月20日
    浏览(25)
  • 【C++】内联函数 ( 概念简介 )

    \\\" 内联函数 \\\" 是 C++ 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率 ; 在 C++ 中 , 定义常量 可以替换 C 语言中的 宏定义 使用 常量 可以 替代 宏定义 ; 宏定义分为两种 , 一种是 宏常数 , 另外一种是 宏代码片段 ; C++ 中使用 常量 替代 宏常数 ; C++ 中用于 替代 宏代码片

    2024年02月10日
    浏览(24)
  • 【C++初阶】:内联函数

    在c语言中,如果一个函数较短并且会被重复使用,那么我们就可以把该函数换成一个宏函数。 贴个小知识,宏函数有许多的坑也是面试官喜欢考的点,如果对行函数不太了解可以看看这篇关于宏的部分传送门 宏函数的优点:不会建立栈帧,提高使用效率。 宏函数的缺点:复

    2023年04月25日
    浏览(21)
  • 【C++】内联函数

    在C语言中,我们学习过宏的用法。宏通常被用于 进行简单的文本替换 来执行一系列的操作,比如一些简单的运算。使用宏可以 避免函数调用时建立栈帧的开销 ,提高程序的性能。我们首先来写一个实现加法功能的宏: 这个宏完美实现了我们的加法需求,但在定义宏时需要

    2024年01月18日
    浏览(23)
  • 【C++内联函数】

    假设有这样的一个场景,有一个代码量不足三行的函数被调用了一万次,现在让你做优化,你会怎么考虑优化? 我们都知道函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能

    2023年04月26日
    浏览(62)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包