天天看点

内联函数的理解

一、内联函数的定义(来自百科)

内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内敛函数,需要看编译器对该函数定义的具体处理。

对于能否形成内联函数,在C++ primer 中有说过 :内敛说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。

二、内联函数的作用

根据内联函数的定义来看,内联函数是在编译时类似宏替换,试用函数体替换调用处的函数名。那么这样做的目的是什么?

内联机制用于优化规模较小、流程直接、频繁调用的函数。它的目的是为了消除函数调用时的时间开销。

三、内联函数的实现

C++有三种实现内敛函数的方式:

1、将函数的定义写在类定义的内部;

2、在类定义内部的函数声明上用inline显式指定;

3、在类定义体外部的函数实现上用inline显式指定;

接下来我们通过一个例子来说这三种方式:

#include<iostream>
using namespace std;
class Point
{
private:
    int x, y;
public:
    void print1()
    {
        cout << "inline 1" << endl;
    }
    inline void print2();
    void print3();
};
void Point::print2()
{
    cout << "inline 2" << endl;
}
inline void Point::print3()
{
    cout << "inline 3" << endl;
}
int main()
{
    Point a;
    a.print1();
    a.print2();
    a.print3();

    return 0;
}
           

这样我们便实现了分别通过这三种形式构造了三种内联函数,但是这里大家要注意的inline并不是强制的,就像上面说的编译器可以决定标有inline的函数不做inline,也就是编译器可以忽略你的这个请求,inline 和 virtual是可以同时使用的,但是这时inline就没什么作用了。

四、注意事项

      最后我来总结一下inline的注意事项:

1、内联函数类似宏替换的方式来实现,我们可以看出这其实是用空间换时间的一种做法,仅仅省去了函数调用的开销,所以提高了函数执行效率。所以执行函数体内代码的时间相比教育函数调用的时间开始较大的时候,我们不宜用内联函数。

所以,再有if语句或switch语句或者递归语句时,我们通常不使用内联函数。内联函数只适合于只有1~5行的小函数。

2、内联函数的定义必须出现在内联函数第一次调用之前。

3、关键词inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前并没有用。

例如:

inline void print();
void print()
{
      cout << "inline" << endl;
}
           

这样是没有用的。