美文网首页
c++   inline

c++   inline

作者: 杏壳 | 来源:发表于2016-10-11 09:26 被阅读138次

在C中,编译器使用宏定义节省编译时间。在C++中使用内联函数来实现同样的效果。在程序编译时,编译器会将内联函数调用处用函数体替换,这一点类似于C语言中的宏扩展。

1 什么是内联函数

内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。

注意:内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如何函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。

2 如何使用内联函数

定义函数时,在函数的最前面以关键字“inline”声明函数,即可使函数成为内联声明函数。


Class A
{
  Public:
      inline int add(int a, int b)
      {
        return (a + b);
      };
}
Class A
{
  Public:
    int add(int a, int b);
};
inline int A::add(int a, int b)
{
    return (a + b);
}

3 为什么使用内联函数

在某个程序上下文内频繁地调用某个函数,其调用函数的花销会有多大:当遇到普通函数的调用指令时,程序会保存当前函数的执行现场,将函数中的局部变量以及函数地址压入堆栈,然后再将即将调用的新函数加载到内存中,这要经历复制参数值、跳转到所调用函数的内存位置、执行函数代码、存储函数返回值等过程,当函数执行完后,再获取之前正在调用的函数的地址,回去继续执行那个函数,运行时间开销简直太多了。
C++内联函数提供了替代函数调用的可选方案,通过inline声明,编译器首先在函数调用处使用函数体本身语句替换了函数调用语句,然后编译替换后的代码。因此,通过内联函数,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场数据。

优点

  • 它通过避免函数调用所带来的开销来提高你程序的运行速度。
  • 当函数调用发生时,它节省了变量弹栈、压栈的开销。
  • 它避免了一个函数执行完返回原现场的开销。
  • 通过将函数声明为内联,你可以把函数定义放在头文件内。

缺点

  • 因为代码的扩展,内联函数增大了可执行程序的体积。
  • C++内联函数的展开是在编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。
  • 当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。
  • 有时候内联函数并不受到青睐,比如在嵌入式系统中,嵌入式系统的存储约束可能不允许体积很大的可执行程序。

4 什么时候使用内联函数

在程序设计时,每个函数都可以声明为inline。下面列举一些有用的建议:

  • 当对程序执行性能有要求时
  • 当你想宏定义一个函数时
  • 在类内部定义的函数会默认声明为inline函数,这有利于类实现细节的隐藏。

5 注意

  • 内联声明只是一种对编译器的建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开。
  • 编译器的内联看起来就像是代码的复制与粘贴,这与预处理宏是很不同的:宏是强制的内联展开,可能将会污染所有的命名空间与代码,将为程序的调试带来困难。
  • 所有类中定义的函数都默认声明为inline函数,因此我们不用显示地去声明inline。虚函数不允许内联。
  • 虽然说模板函数放在头文件中,但它们不一定是内联的。(不是说定义在头文件中的函数都是内联函数)。

参考

What is C++ inline functions
Inline Functions

相关文章

  • Function Macros

    Avoid function macros. In C++,inline functions render fun...

  • c++   inline

    在C中,编译器使用宏定义节省编译时间。在C++中使用内联函数来实现同样的效果。在程序编译时,编译器会将内联函数调用...

  • 2018-03-07

    关于c++的inline关键字,以下说法正确的是() 正确答案: D 你的答案: A(错误) A使用inline关...

  • 第一周(Geek Band)

    C++实现数据和函数的封装 C++面向对象(ObjectOriented) 基本格式 Inline内联函数关键字 ...

  • 高质量C++编程指南 ----C++函数的高级特性

    8. C++函数的高级特性 对比于C 语言的函数,C++增加了重载(overloaded)、内联(inline)、...

  • 《Effective C++中文版》目录

    让自己习惯C++ 1、视C++为一个语言联邦 2、尽量以const、enum、inline替换#define 3、...

  • C++基础

    C++ readme 避免头文件重复定义, extern C的用法: 内联函数: inline function ...

  • 什么时候不能使用虚函数

    类属static函数,构造函数s,inline函数(请参考《effective c++》p.136),模板成员函数...

  • Effective C++

    Effective C++ 的忠告: 尽量用const和inline,而不用#define,即尽量用编译器,而不用...

  • 《Effective C++》读书笔记

    1 让自己习惯C++重点内容 条款2:尽量以const, enum, inline替换 define的记号没有进入...

网友评论

      本文标题:c++   inline

      本文链接:https://www.haomeiwen.com/subject/ktekyttx.html