【C++内联函数】

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

前言

假设有这样的一个场景,有一个代码量不足三行的函数被调用了一万次,现在让你做优化,你会怎么考虑优化?
我们都知道函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。
如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。
所以为了解决上面的场景C语言使用了宏函数来进行对一些特定的场景使用。但是宏函数在使用过程中特别容易出错。比如:将这个Add函数写成宏函数。
【C++内联函数】
【C++内联函数】
写个简单Add的宏函数需要加这么多括号,考虑这么多反例,更要命的是宏是不支持调试的。为了解决这个"坑",祖师爷就在C++中引入了内联函数

内联函数的概念

直观的来讲,在函数的返回值前加上关键字inline的函数就是内联函数。编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
函数调用的汇编:
【C++内联函数】
在默认的debug模式下,inline不起作用,否则不方便调试。所以,为了更好的看到展开后的汇编需要重新设置一下。步骤如下:
【C++内联函数】
【C++内联函数】
【C++内联函数】
函数展开的汇编:
【C++内联函数】

内联函数的特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为《C++prime》第五版关于inline的建议:
    【C++内联函数】
    编译器:我的规矩就是规矩(哈哈,开个玩笑)。
    【C++内联函数】
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。比如:
    【C++内联函数】
    简单说明就是func()函数由于声明时是内联函数,所以在编译阶段没有进入符号表。在链接阶段时编译器只找到func()的声明,展开不了func函数。于是去符号表里找函数的地址,但是没找到所以就发生了链接错误。
  4. 类里面的成员函数也是内联函数。

内联函数的总结

使用:

当对程序执行性能有要求时,那么就适当使用内联函数
写一些功能专一且性能关键的函数,这些函数的函数体不大,包含了很少的执行语句。通过inline声明,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场据。
不使用:

不使用:如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
不使用:如果函数体内出现循环或者开关语句;那么执行函数体内代码的时间要比函数调用的开销大。文章来源地址https://www.toymoban.com/news/detail-425462.html

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

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

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

相关文章

  • C++内联函数详解

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

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

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

    2024年01月18日
    浏览(22)
  • 『C++成长记』C++入门——内联函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、内联函数 📒1.1内联函数的概念 📒1.2内联函数的特征 二、auto 📒2.1auto简介 📒2.2auto使用规则 📒2.3auto无法使用的场景 三、基于范围的for循

    2024年02月05日
    浏览(29)
  • 【C++入门】内联函数的秘密

    inline 修饰的函数叫内联函数,编译后会在调用内联函数的地方展开,没有调用函数的开销,可以提高程序运行的效率。 例子: 但是 inline 只是给编译器的一个建议,编译器自己会决定内联函数是否在调用处展开。 内联函数展开是一种空间换时间的做法,可能会造成代码膨胀

    2024年02月12日
    浏览(23)
  • 【C++】初阶 --- 内联函数(inline)

    🥰 用C语言先来实现普通的Add函数看一下 👇 转到反汇编来看一下: 可以看到,编译器为了实现一个简单的相加函数,Add函数体内需要执行的汇编指令要很多,而且为了调用函数还要执行指令跳转 (并且要在栈区上为函数开辟栈帧空间) ,如果 Add函数被重复大量地使用,则会

    2024年02月14日
    浏览(23)
  • C++:命名空间,缺省参数,函数重载,引用,内联函数

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++知识总结,我们来认识命名空间,缺省参数,函数重载,引用,内联函数。 那么在介绍命名空间时,我们先用C++的方式打印\\\"hello world\\\"。 其中,using namespace std; 就是一种命名空间的使用。 在

    2024年02月11日
    浏览(30)
  • 【C++】内联函数与快速读入read函数(整型)

    在学习C++的过程中,在很多的题解中都发现了利用read来实现快速读入的功能,今天,我们就来学习一下快速读入这个函数,并顺带着学习一下内联函数 在学习read函数之前,我们先来学习一下内联函数 我们都知道,函数在分类上可以分为 主调函数和被调函数 ,main函数就是主

    2024年02月10日
    浏览(25)
  • 【C++】内联函数----inline函数的详细使用教程

    🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己, 强大自己才是核心 。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天

    2024年02月04日
    浏览(37)
  • C++从入门到精通——内联函数

    内联函数是一种优化手段,通过在编译时将函数调用替换为函数体本身的复制品,以减少函数调用的开销。它适用于函数体较小、调用频繁的情况。使用内联函数可以提高程序执行效率,但也会增加最终生成的代码大小。在C++中,可以使用 inline 声明内联函数。然而,

    2024年04月10日
    浏览(27)
  • 【C++入门到精通】C++入门 —— 引用、内联函数

    目录 一、引用 1.引用的概念 2.引用的特性 3.常引用 4.引用的使用场景         ⭕做参数         ⭕做返回值 5.传值、传引用效率比较 值和引用的作为返回值类型的性能比较 6.引用和指针的区别  引用和指针的不同点  二、内联函数 1.内联函数的概念 2.内联函数的特性

    2024年02月16日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包