C++中的内联函数

来源:互联网 发布:域名到期抢注 编辑:程序博客网 时间:2024/06/06 12:31

本文主要和大家一起来学习一下C++中的内联函数,旨在能够更深层次的了解和掌握C++相关用法,力争做到知其然还要知其所以然。
关于内联函数,本文主要从以下几个方面进行了整理和归纳。
一、相关描述
1、内联函数主要目的是为了提高函数的执行效率,用关键字inline放在函数定义的前面即可,将函数指定为内联函数。
2、内联函数通常就是将它在程序中的每个调用点上“内联地”展开,例如定义比较两个数大小的函数。

inline int max(int a,int b){    return a>b?a:b;}

调用cout<<max(a,b)<<endl;在编译时展开为:cout<<(a>b?a:b)<<endl;从而消除了把max写成函数的额外执行开销。
3、这里说的调用开销仅指参数压栈、跳转、退栈和返回等操作,并不包括执行函数体所需要的开销

二、内敛函数的声明和定义
C++ inline函数是一种用于实现的关键字,一般地用户可以看到函数的声明,但看不到函数的定义。
1、如下风格的函数func则是内联函数:

inline void func(int x,int y){//...}//inline与函数定义放在一起

2、定义在类声明之中的成员函数将自动地成为内联函数:

classA{public:    void func(int x,int y)    {        //...    }};

编译器是否将它真正内联则要看func函数如何定义,光看函数声明是不够的

三、内联函数的使用方法
1、内联函数应该在头文件中定义,这一点不同于其他函数。编译器在调用点内联展开函数的代码时,必须能够找到inline函数的定义才能将调用函数替换为函数代码,而对于在头文件中仅有函数声明是不够的。
2、内联函数的定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的)。即使是放在头文件中,编译器也是对每个定义做一份拷贝。
3、相对于放在源文件中,放在头文件中既能够确保调用函数定义是相同的,又能够保证在调用点能够找到函数定义从而完成内联(替换)
4、在头文件中加入或修改inline函数时,使用了该头文件的所有源文件都必须重新编译。

四、什么时候用内联函数?
内联函数仅仅省去了函数调用的开销,从而提高了程序的执行效率。上面说到的调用开销,并不包括执行函数体所需要的开销。
1、当函数体积比较小的时候,内联函数可以令目标代码更加高效,对于存取函数以及其他函数体比较短,性能关键的函数,鼓励使用内联;
2、如果执行函数体内代码的时间比函数调用的开销大得多,那么inline的效率收益会很小,另一方面,每一处内联函数的调用都要拷贝代码将会使程序的总代码量增大,消耗更多的内存空间。

原创粉丝点击