C++内联函数

来源:互联网 发布:艾蕾 知乎 编辑:程序博客网 时间:2024/05/18 05:00

内联函数

c++扩展了c语言的函数功能。通过inline关键字用于函数的定义,并在首次调用函数前提供其函数的定义,可以使得C++编译期将该函数视为内联函数。也就是说编译期不是让程序跳到独立的代码片段,以执行函数。而是用相应的代码来替换函数调用。
Google C++编码规范中则规定:

  • 一个较为合理的经验准则是, 不要内联超过 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 与函数定义体放在一起  {   …  }   

所以说, inline 是一种“用于实现的关键字” ,而不是一种“用于声明的关键字” 。 一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内 联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数 的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量 C++/C 程序设计风格 的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需 要内联。

定义在类声明之中的成员函数将自动地成为内联函数,例如

 //头文件  class A  {  public:      void Foo(int x, int y);   }  // 定义文件  inline void A::Foo(int x, int y)  {  …  }  

特点

  1. 内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直
    接忽略内联请求。
  2. C++编译器直接将函数体插入在函数调用的地方 。
  3. 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。
  4. 内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型
    等)。
  5. 内联函数由 编译器处理,直接将编译后的函数体插入调用的地方,
    宏代码片段 由预处理器处理, 进行简单的文本替换,没有任何编译过程。
  6. 编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优
    势只是省去了函数调用时压栈,跳转和返回的开销。因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。

  7. C++中内联编译的限制:

    • 不能存在任何形式的循环语句
    • 不能存在过多的条件判断语句
    • 函数体不能过于庞大
    • 不能对函数进行取址操作
    • 函数内联声明必须在调用语句之前

内联与宏

这里写图片描述

参考:
函数内联

总结

优点

避免调用时的额外开销(入栈与出栈操作)

代价:

由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码
段的空间。

本质

以牺牲代码段空间为代价,提高程序的运行时间的效率。

适用场景

函数体很“小”,且被“频繁”调用。