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

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. IOS中打开应用实现检查更新的功能
  2. 线性分类器与非线性分类器的区别是什么?有哪些优劣特性?
  3. 交互式python shell
  4. Flink从入门到精通100篇(十七)-Spark/Flink广播如何实现作业配置动态更新?
  5. [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platfor
  6. 如何成为优秀的程序员
  7. oracle中的and用法,Oracle bitand( )函数简介
  8. 简单实用的多线程学习实例
  9. python string.format()_python string format
  10. 京东回应淘汰员工;阿里巴巴建江苏总部;5G 移动网被吐槽 | 极客头条
  11. 原生 js 轮播图(8)
  12. 计算机刻录光盘不显示,为什么我的CD刻录光盘的容量在
  13. 【2022最新罗技G502吃鸡宏】
  14. 【英语阅读】纽约时报 | 李子柒:隔离时期的田园“公主”
  15. 使用github创建个人网站
  16. Gary Rong:以太坊的轻节点协议
  17. 【大学生辩论赛】如何练习自己的辩论口才
  18. 云服务器安装软件,如何在云服务器中安装软件
  19. 1. 拼多多什么软件可以看到大数据?拼多多大数据分析软件有哪些?
  20. HTML 表格与表单 个人简历

热门文章

  1. 2023年1月1日生效:2023年火车高铁儿童票最新规则及高铁火车2023儿童票怎么购买?
  2. 编写html邮件/EDM邮件注意事项
  3. openstack之flavor管理
  4. 弘辽科技:直通车总集篇(上篇)
  5. python网络开发框架_python网络编程学习笔记(10):webpy框架
  6. 最近工作中遇到的8个问题
  7. 异常Throwable
  8. 深入浅出matplotlib(25):模块patches绘制几何图形
  9. split mysql的用法_mysql split函数用法实例
  10. Smarty教程[4]