原创文章,转载请注明出处。

C++ Inline记录

  • 前言
  • 1>inline 函数工作原理
  • 2>inline 函数作用
    • 2.1>消除函数调用的开销
      • 宏定义(define)和内联函数(inline)的区别
        • 1>内联函数是在编译时展开,而宏在编译预处理时展开;在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。
        • 2>内联函数是真正的函数,和普通函数调用的方法一样,在调用点处直接展开,避免了函数的参数压栈操作,减少了调用的开销。而宏定义编写较为复杂,常需要增加一些括号来避免歧义。
        • 3>宏定义只进行文本替换,不会对参数的类型、语句能否正常编译等进行检查。而内联函数是真正的函数,会对参数的类型、函数体内的语句编写是否正确等进行检查。
    • 2.2>去除函数只能定义一次的限制
  • 3>要注意的几点
    • 问:内联函数一定会被编译器在调用点展开吗?
    • 问:“调用”普通函数时,一定是调用吗?
    • 问:既然内联函数在编译阶段已经在调用点被展开,那么程序运行时,对应的内存中不包含内联函数的定义,对吗?
    • 问:既然内联函数可以大大减少由函数调用带来的开销,提高程序的运行效率。那为什么所有的函数不都被设计成内联?

前言

inline是C++关键字,在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。

1>inline 函数工作原理

内联函数不是在调用时发生控制转移关系,而是在编译阶段将函数体嵌入到每一个调用该函数的语句块中,编译器会将程序中出现内联函数的调用表达式用内联函数的函数体来替换。

普通函数是将程序执行转移到被调用函数所存放的内存地址,当函数执行完后,返回到执行此函数前的地方。转移操作需要保护现场,被调函数执行完后,再恢复现场,该过程需要较大的资源开销。

2>inline 函数作用

2.1>消除函数调用的开销

在内联函数出现之前,程序员通常用 #define 定义一些“函数”来消除调用这些函数的开销。内联函数设计的目的之一,就是取代 #define 的这项功能。

宏定义(define)和内联函数(inline)的区别

1>内联函数是在编译时展开,而宏在编译预处理时展开;在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换。

2>内联函数是真正的函数,和普通函数调用的方法一样,在调用点处直接展开,避免了函数的参数压栈操作,减少了调用的开销。而宏定义编写较为复杂,常需要增加一些括号来避免歧义。

3>宏定义只进行文本替换,不会对参数的类型、语句能否正常编译等进行检查。而内联函数是真正的函数,会对参数的类型、函数体内的语句编写是否正确等进行检查。

2.2>去除函数只能定义一次的限制

内联函数可以在头文件中被定义,并被多个 .cpp 文件 include,而不会有重定义错误。这也是设计内联函数的主要目的之一。

3>要注意的几点

问:内联函数一定会被编译器在调用点展开吗?

错,inline 只是对编译器的建议,而非命令。编译器可以选择忽视 inline。当程序员定义的 inline 函数包含复杂递归,或者 inlinie 函数本身比较长,编译器一般不会将其展开,而仍然会选择函数调用。

问:“调用”普通函数时,一定是调用吗?

错,即使是普通函数,编译器也可以选择进行优化,将普通函数在“调用”点展开。

问:既然内联函数在编译阶段已经在调用点被展开,那么程序运行时,对应的内存中不包含内联函数的定义,对吗?

错。
首先,如第一点所言,编译器可以选择调用内联函数,而非展开内联函数。因此,内存中仍然需要一份内联函数的定义,以供调用。
而且,一致性是所有语言都应该遵守的准则。普通函数可以有指向它的函数指针,那么,内联函数也可以有指向它的函数指针,因此,内存中需要一份内联函数的定义,使得这样的函数指针可以存在。

问:既然内联函数可以大大减少由函数调用带来的开销,提高程序的运行效率。那为什么所有的函数不都被设计成内联?

因为 内联是以代码膨胀复制为代价 ,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码, 将使程序的总代码量增大,消耗更多的内存空间。
以下情况不宜使用内联:
1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

以下情况适宜使用内联
对于只有几条语句的小函数来说,与函数的调用、返回有关的准备和收尾工作的代码往往比函数体本身的代码要大得多。因此,对于这类简单的、使用频繁的小函数,将之说明为内联函数可提高运行效率。

谢谢,创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 <( ̄︶ ̄)>

C++ Inline关键字相关推荐

  1. 、简述global关键字的作用_详解static inline关键字

    详解static inline关键字 本文章为知乎用户 @徐yang哟 原创,禁止抄袭! 灵感来源 在查stm32的LL库部分函数的API时,有时会查到这种函数: __STATIC_INLINE vo ...

  2. 【内联函数】inline关键字的作用与内联函数的特性

    学习导航 一.内联函数产生的意义 二.内联函数的使用 三.内联函数的作用 ①简单易懂 ②支持调试 ③支持类型检查 四.内联函数的特性 一.内联函数产生的意义  在C语言中,如果我们频繁调用某些函数,并 ...

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

    当程序执行函数调用指令时,CPU将存储该函数调用后指令的内存地址,将函数的参数复制到堆栈上,最后将控制权转移到指定的函数.然后,CPU执行函数代码,将函数返回值存储在预定义的内存位置/寄存器中,并将控 ...

  4. c语言inline有什么作用,C语言inline关键字

    一.inline关键字的概念 inline关键字是C99标准的型关键字,其作用是将函数展开,吧函数的代码复制到每一个调用处.这样调用函数的过程就可以直接执行函数代码,而不发生跳转.压栈等一般性函数操作 ...

  5. 详解static inline关键字

    本文章为知乎用户 @徐yang哟 原创,禁止抄袭! 灵感来源 在查stm32的LL库部分函数的API时,有时会查到这种函数: __STATIC_INLINE void LL_GPIO_SetPinOu ...

  6. 一个关于C++ Inline关键字的引发的一个错误

    最近在学习C++,看到内联函数,就上机编了一个小程序,我本来以为可简单的语法,可是竟然在我编绎成功后,执行的时候出现了下面的错误: Linking cpp.obj : error LNK2001: u ...

  7. GCC 关键字inline探究

    一.inline介绍 先看造型: inline int test() {     ......     return 0; } int main() {     test();     return ...

  8. 内联函数 —— C 中关键字 inline 用法解析

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...

  9. [C++] 内联函数inline 以及 auto关键字 -- C++入门(4)

    本篇文章主要包括内联函数和auto关键字.其中,内敛函数包括概念,特性等:auto关键字的使用规则,使用场景等. 目录 1.内敛函数 1.1问题引入: 1.2内联函数的概念 1.3内敛函数的特性 2. ...

最新文章

  1. NYOJ 12 喷水装置(二)
  2. Vs2008不能调试的问题
  3. 我们为什么需要工作流
  4. Visual Studio 2022 17.1 正式发布,5个新亮点!
  5. 直接启动SDK Manager: $ADNROID_HOME/tools/android
  6. html的!DOCTYPE标签初窥
  7. HTML5学习笔记四: 列表, 块和布局
  8. 今时今日,C还适合当下之所需么?
  9. 判断new出来的对象里面值为null
  10. [bzoj5158][Tjoi2014]Alice and Bob
  11. 操作系统学习笔记:文件管理
  12. 计算机网络谢希仁课后答案第七版答案完整版
  13. 极乐净土html5代码,天谕手游极乐净土乐谱代码分享
  14. 美国密歇根州立大学计算机专业,密歇根州立大学计算机科学与工程系
  15. 笔记本散热不好怎么办
  16. 使用阿里云的【身份证实名认证接口】API核验用户的真实性
  17. html输入框位置控制,JS 控制input 输入框光标位置
  18. MSN群每周讨论之快速估算和管理
  19. c语言中表明空格的是什么代码,C语言代码中的空白符表示什么
  20. 使用在Photoshop上的30个纺织物纹理Ps笔刷

热门文章

  1. 现代数字通信第八章——阵列信号处理与空域滤波
  2. 云尚发卡PHP,PHP云尚发卡系统V1.5.7源码
  3. 用Gradle脚本管理Manifest文件
  4. Android之通过配置Flavor实现一个项目打包成多个apk(转载)
  5. 室内P2全彩LED高清显示屏做多大面积分辨率有2K(1920*1080)
  6. 金蝉机器人_《金蝉脱壳2》曝机器人特辑 高科技监狱好戏开场
  7. 设计模式(一):命令模式(2)——命令模式扩展之宏命令
  8. python 小说下载_Python实现的飞速中文网小说下载脚本
  9. 编译原理实验:自下而上的语法分析--(LR分析)
  10. 无法定位序数5076与动态链接库MFC42D.DLL 解决办法