inline函数返回值_C++ inline关键字详解

inline函数返回值_C++ inline关键字详解当程序执行函数调用指令时 CPU 将存储该函数调用后指令的内存地址 将函数的参数复制到堆栈上 最后将控制权转移到指定的函数 然后 CPU 执行函数代码 将函数返回值存储在预定义的内存位置 寄存器中 并将控制权返回给调用函数 如果函数的执行时间少于从调用者函数到被调用函数 被调用者 的切换时间 则这可能会成为开销 对于大型函数和 或执行复杂任务的函数 与函数运行所花费的时间相比 函数调用的开销通常微不足

87e1b1bf3349292d40dd1140c584892e.png

当程序执行函数调用指令时,CPU将存储该函数调用后指令的内存地址,将函数的参数复制到堆栈上,最后将控制权转移到指定的函数。然后,CPU执行函数代码,将函数返回值存储在预定义的内存位置/寄存器中,并将控制权返回给调用函数。如果函数的执行时间少于从调用者函数到被调用函数(被调用者)的切换时间,则这可能会成为开销。对于大型函数和/或执行复杂任务的函数,与函数运行所花费的时间相比,函数调用的开销通常微不足道。但是,对于小型的常用功能,进行函数调用所需的时间通常比实际执行函数代码所需的时间多得多。对于小功能,由于小功能的执行时间少于切换时间,因此会产生开销。

C++提供了inline函数,以减少函数调用的开销。内联函数是在调用时在行中扩展的函数。调用内联函数时,将在内联函数调用时插入或替换内联函数的整个代码。替换由C++编译器在编译时执行。如果内联函数很小,则可以提高效率。

inline函数看起来像函数,动作像函数,但是又比宏方便很多,调用inline函数省去了参数压栈、生成汇编语言的 CALL调用、返回参数、执行return等过程所花费的额外开销。不过inline函数也有缺点:增加目标码的大小。因为inline函数的设计思想是对该函数的所有调用都用函数本身替换掉,和宏定义一样,但是比宏定义用起来要简单很多。而且inline的调试同样很难。

所以,inline函数对于函数体积很小,却又频繁调用这样的函数来说,可能比函数调用产生的代码更少,但是效率却不可同日而语。有一点需要注意的是:inline只是对编译器提出一个申请,并不是强制命令。编译器可以忽略内联请求。 在以下情况下,编译器可能不会执行内联:

  • 如果函数包含循环。(对于while,do-while)
  • 如果函数包含静态变量。
  • 如果函数是递归的。
  • 如果函数的返回类型不是void,并且函数主体中不存在return语句。
  • 如果函数包含switch或goto语句。

inline可以显示声明,也可以隐式声明。隐式声明方式是将函数定义在类定义之中(函数定义时没有inline关键字),编译器也会当作inline函数。另外,定义在类中的friend函数也会被隐式声明为inline函数。

显式声明的时候必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。定义函数内联的语法为:

inline 

此外,inline函数通常放在头文件中,因为大多数build environments在编译期进行inlining,编译器必须知道函数什么样子才能把函数调用替换成函数本体

大多数virtual函数不能inlining:因为virtual直到运行时才知道调用哪个函数,而inline是在执行前进行替换。此外,对于通过函数指针进行的调用编译器通常不会inlining,下面是一个实例:

inline 

内联函数的优点:

  1. 不会发生函数调用开销。
  2. 调用函数时,还节省了push / pop变量在栈上的开销。
  3. 它还节省了从函数返回调用的开销。
  4. 内联函数时,可以使编译器对函数主体执行特定于上下文的优化。对于正常的函数调用,这种优化是不可能的。通过考虑调用上下文和被调用上下文的流程可以获得其他优化。
  5. 内联函数可能对于嵌入式系统有用(如果很小),因为内联函数所产生的代码少于函数调用的前导和返回。

内联函数的缺点:

  1. 内联函数中添加的变量消耗了额外的寄存器,在内联函数之后,如果要使用寄存器的变量编号增加,则它们可能会增加寄存器变量资源利用的开销。这意味着当在函数调用点替换内联函数主体时,该函数使用的变量总数也会被插入。因此,将用于变量的寄存器数量也将增加。因此,如果函数内联后的变量数急剧增加,则肯定会导致寄存器利用率增加。
  2. 如果使用太多的内联函数,则由于重复执行相同的代码,二进制可执行文件的大小将很大。
  3. 过多的内联也会降低指令Cache命中率,从而降低了从高速缓存到主存储器的指令获取速度。
  4. 如果有人更改了内联函数中的代码,则内联函数可能会增加编译时间开销,然后必须重新编译所有调用位置,这是因为编译器将需要再次替换所有代码以反映更改,否则它将继续使用旧功能。
  5. 内联函数对于许多嵌入式系统可能没有用。因为在嵌入式系统中,代码大小比速度更重要。
  6. 内联函数可能会导致崩溃,因为内联可能会增加二进制可执行文件的大小。内存溢出会导致计算机性能下降。

Note:

  • 将大多数内联限制在小的,经常调用的函数中。这有助于调试和二进制可升级性,最大程度地减少潜在的代码膨胀,并最大程度地提高程序速度。
  • 不要仅仅因为函数模板出现在头文件中就声明inline。

Reference

Effective C++

https://www.geeksforgeeks.org/inline-functions-cpp/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226944.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:19
下一篇 2026年3月16日 下午10:19


相关推荐

  • OpenClaw 详细部署流程(Windows版)

    OpenClaw 详细部署流程(Windows版)

    2026年3月13日
    9
  • 华为 OSPF基本概念与基础配置

    华为 OSPF基本概念与基础配置在战胜敌人之前 先战胜自己 文章目录一 拓扑二 基础配置三 观察与分析四 OSPF 基本概念五 OSPF 一些性质 OSPF 是一种应用非常广泛发基于链路状态的动态路由协议 它具有区域 Area 化的层次结构 扩展性好 收敛速度快 适合部署在各种规模的网络上

    2026年3月17日
    2
  • struts2的response的contentType设置

    struts2的response的contentType设置服务器端发送到客户端,提示保存还是打开?       response.setContentType(“text/html;charset=utf-8”)发送到客户端格式不正确。使用ajaxUpload插件的时候,strust2返回application/json格式的数据,但是ajaxUpload要求返回text/html,这样就需要在配置文件中配置contentType项。

    2022年7月19日
    18
  • 基于UDP编程_udp详解

    基于UDP编程_udp详解基于UDP编程1UDP是数据报协议,无连接的,不可靠,追求传输效率的一种通信协议数据的发送和接收是同步的.在进行通信之前,不需要建立连接.其传输效率比TCP高.对其服务器而言,并没有三次握手的过程.因此和TCP相比,少了被动监听(listen)和(accept).只需要创建通信设备,绑定IP地址和端口号.然后进行数据的收发.1.服务器端的编程模型创建一个socket端点,返回该端点的文件描述符fdsocket(2)2)将fd和本地地址绑定bind(2)while(1){3)阻塞等待

    2025年9月11日
    7
  • testlink用例导入导出平台小脚本:Excel和xml相互转换[通俗易懂]

    testlink用例导入导出平台小脚本:Excel和xml相互转换[通俗易懂]目录testlink用例导入导出平台小脚本:Excel和xml相互转换testlink导出xml在导入xml转Excelexcel转xmlExcel格式如下testlink用例导入导出平台小脚本:Excel和xml相互转换公司启用testlink测试用例平台,发现测试用例的导入导出只支持xml,在testlink上写用例又比较麻烦,效率不高,百度了下,改了源文件测试导入导出直接报错,想着还是自己写个小脚本吧。testlink导出xml在导入在testlink平台写几条测试用例后导出,然后观察xm

    2022年8月22日
    9
  • Mysql数据库课程设计

    Mysql数据库课程设计Hello小伙伴们,大家好,我是楠橘星!!今天给大家分享一下使用javafx编写的前端的Mysql数据库课程设计题库与试卷生成系统!废话不多说了,直接上截图,希望对大家有所帮助!(建议拿来参考不建议直接CV哦!)1.系统需求分析1-1、功能分析通过深入细致的调查,多方面搜集资料,以及实地考察等方法,经过总结研究,总结出了试卷生成系统的的基本的业务功能,详细如下:学生信息维护:主要完成学生的学号、班级、考试信息等操作。教师信息维护:主要是教师信息的添加、修改和删除等操作。题库信息维护

    2022年5月19日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号