欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++的inline

程序员文章站 2024-03-23 13:50:46
...

前言

我也不知道为什么要记录inline,也许是强迫症吧

一 正文

1.1 为何要inline

为什么会引入inline来修饰函数?

因为,大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置。

有人想要更快一点,让调用函数不做那么多工作,于是,就提出了inline来修饰函数,这就是内联函数inline了,之所以,叫它内联函数,是因为…

  • 别人的话:
    执行C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(注意是定义而非声明,下文继续讲到)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开。
  • 自己的话:inline用于声明内联函数,内联函数作用可以省去函数调用的开销,编译器会将内联函数复制展开。

1.2 inline定义与性质

  • 定义:当函数被声明为内联函数之后,编译器会将其内联展开,而不是按通常函数调用。

  • 性质

    • 只有当函数只有10行甚至更少时才将其定义为内联函数

    • 内联以代码膨胀(拷贝)为代价,仅仅省去了函数调用的开销。

      • 函数调用开销:参数压栈、跳转、退栈和返回等操作,不包括执行函数体的开销
    • 关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用。

    // 如下风格的函数 Foo 不能成为内联函数:
    inline void Foo(int x, int y);   // inline 仅与函数声明放在一起   
    void Foo(int x, int y)
    {
     ...
    } 
    
    // 而如下风格的函数 Foo 则成为内联函数:
    void Foo(int x, int y);   
    inline void Foo(int x, int y)   // inline 与函数定义体放在一起
    {
     ...
    } 
    

1.3 inline特点

  • 优点

    • 当函数体比较小的时候,内联该函数可以令目标代码更加高效
    • 函数被内联后,编译器就可以通过上下文相关的优化技术对结果代码执行更深入的优化。
  • 缺点:

    • 滥用内联将导致程序变慢
  • 不宜用

    • 函数体内的代码不能太长
    • 不能用在循环或者switch等复杂的控制结构
    • 不要轻易让构造函数和析构函数称为内联函数inline
  • 内联和宏

    • 宏的作用是在预处理的时候替换函数调用
      • 宏容易出错
      • 无法调试
      • 无法操作类的私有成员
    • 内联的作用也是像宏一样进行代码展开,编译器会将内联函数展开拷贝。

参考资料

[1] C++ 关键字 inline详细介绍. jb51. 2014.01.
https://www.jb51.net/article/46261.htm