c/c++语言开发共享C++实操之内联成员函数介绍

目录前言什么是内联函数:如何使一个函数成为内联:为什么使用内联:优点 :缺点 :关键点 :总结前言在c语言中,我们使用了宏函数,这是编译器用来减少执行时间的一种优化技术。那么问题来了,在c++中,有什

目录
  • 前言
  • 什么是内联函数:
  • 如何使一个函数成为内联:
  • 为什么使用内联:
    • 优点 :
    • 缺点 :
    • 关键点 :
  • 总结

    前言

    在c语言中,我们使用了宏函数,这是编译器用来减少执行时间的一种优化技术。那么问题来了,在c++中,有什么更好的方法来解决这个问题呢?我们引入了内联函数,这是编译器用来减少执行时间的一种优化技术。我们将讨论内联函数的 “what, why, when & how”。

    什么是内联函数:

    内联函数是c++的一个增强功能,可以减少程序的执行时间。函数可以通过指示编译器,使其成为内联函数,这样编译器就可以取代那些被调用的函数定义。编译器会在编译时替换内联函数的定义,而不是在运行时引用函数定义。

    注意:这只是建议编译器将函数内联,如果函数很大(在可执行指令等方面),编译器可以忽略 “内联 “请求,将函数作为普通函数处理。

    如何使一个函数成为内联:

    要使任何函数成为内联函数,在其定义的开头使用关键字 “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);     }           第三种情况:     inline int add_two (int a, int b)     {       return (a+b);     }

    你可以在它的类定义中定义一个成员函数,或者如果你已经在类定义中声明了(但没有定义)该成员函数,你可以在外面定义它。

    第一种情况:

    当在类成员列表中定义的成员函数默认为内联成员函数,所以第一个class a定义里,也可以省略inline关键字。

    一般含有几行代码的成员函数通常被内联声明,或者说可以在类的定义中定义较短的函数。

    第二种情况:

    如果你在类定义之外定义一个成员函数,它必须出现在包围类定义的命名空间范围内。你还必须使用范围解析(::)操作符来限定成员函数的名称。

    这时如果要声明为内联函数,可以类中用inline关键字声明它(并在其类之外定义该函数),或者在类的声明之外用inline关键字定义它。

    上面第二个class a是在定义处使用inline关键字。

    第三种情况:

    普通的全局函数,可以在声明或定义处添加inline关键字。

    在下面的例子中,成员函数y::f()是一个内联成员函数:

    链接属性:

    内联修饰符不影响成员或非成员函数的链接属性:链接默认为外部链接。

    内部链接表示只在当前文件内可访问,外部链接表示多个文件可访问。

    局部类的成员函数必须在其类定义中定义。因此,局部类的成员函数是隐含的内联函数。这些内联成员函数没有链接属性。

    为什么使用内联:

    在许多地方,我们为小的工作/功能创建函数,其中包含简单和较少数量的可执行指令。想象一下它们每次被调用者调用时的开销。

    当遇到正常的函数调用指令时,程序会存储紧随函数调用语句之后的指令的内存地址,将被调用的函数加载到内存中,复制参数值,跳转到被调用函数的内存位置,执行函数代码,存储函数的返回值,然后跳回执行被调用函数前刚刚保存的指令地址。运行时间开销太大。

    c++的内联函数提供了一个替代方案。使用inline关键字,编译器用函数代码本身替换函数调用语句,然后编译整个代码(此过程成为代码展开)。因此,使用内联函数,编译器不必跳到另一个位置来执行函数,然后再跳回来,因为被调用函数的代码已经提供给调用程序。

    通过下面的优点、缺点和性能分析,你将能够理解为什么使用“inline”关键字。

    优点 :

    1. 它避免了函数调用的开销,从而加快了程序执行。

    2. 当函数调用发生时,它节省了在堆栈上push/pop变量的开销。

    3. 它节省了从一个函数中返回调用处的开销。

    4. 它通过利用指令缓存来更多使用本地引用。

    5. 通过将其标记为内联,你可以将函数定义放在头文件中(也就是说,它可以包含在多个编译单元中,而不会被链接器抱怨)。

    缺点 :

    1. 由于代码展开,增加了最终可执行文件的大小。

    2. c++的内联是在编译时处理的。这意味着如果你改变了内联函数的代码,你将需要重新编译所有使用它的代码,以确保它被更新。

    3.  当在头文件中使用时,它使你的头文件变得更大,因为用户并不关心这些信息。

    4.  如上所述,它增加了可执行文件的大小,这可能会导致内存的抖动。更多的页面故障会降低你的程序性能。

    5. 有时并不实用,例如在嵌入式系统中,由于存储空间的限制,要保证尽可能小的可执行文件。

    关键点 :

    1. 内联函数只是一个建议,而不是强制性的。编译器可能会也可能不会内联你标记为内联的函数。没有标记为内联的函数,在编译或连接时,也可能被设置为内联。

    2. 内联的工作方式就像编译器控制的复制/粘贴,这与预处理器的宏完全不同。宏会被强行内联,会污染所有的命名空间和代码,不容易调试。

    3. 所有在类中声明并定义的成员函数默认是内联的。所以不需要明确定义为内联。

    4. 虚函数不支持内联。但是,有时候,当编译器可以确定对象的类型时(即对象是在同一个函数体中声明和构造的),即使是一个虚拟函数也会被内联,因为编译器确切地知道对象的类型。

    5. 模板方法/函数并不总是被内联的(它们在头文件中的存在不会使它们自动内联)。

    6. 大多数编译器会对递归函数进行内联,有些编译器有此功能的开关,并可以设置最大的递归深度。

    总结

    到此这篇关于c++实操之内联成员函数介绍的文章就介绍到这了,更多相关c++内联成员函数内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

    需要了解更多c/c++开发分享C++实操之内联成员函数介绍,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

    本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

    ctvol管理联系方式QQ:251552304

    本文章地址:https://www.ctvol.com/c-cdevelopment/985799.html

    (0)
    上一篇 2021年12月23日
    下一篇 2021年12月23日

    精彩推荐