内联函数 inline

有时候需要频繁调用一些函数,而编译器在调用函数的时候会消耗栈空间。为了解决这种问题,我们可以使用关键字 inline

举个栗子

这是我们熟悉的函数

int sum(const int &a,const int &b)
{
    return a + b;
}

int main(int argc, char const *argv[])
{
    int a(5);
    int b(7);
    std::cout<<sum(a,b)<<std::endl;
    return 0;
}

这种相加的函数我们很有可能随时都要用到,可能在一个程序中要调用几十次

所以可以在函数定义上加一个inline

inline int sum(const int &a,const int &b)
{
    return a + b;
}

int main(int argc, char const *argv[])
{
    int a(5);
    int b(7);
    std::cout<<sum(a,b)<<std::endl;
    return 0;
}

inline告诉编译器,这个函数在调用的时候,可以直接复制代码给调用的函数,这样更节省栈空间

至于编译器会不会真的这样做,那我们就无法控制了,inline只是一个建议

inline要放在定义里面

如果只有声明里有inline 定义里没有,那么这个inline不起作用

比如下面这个例子,是无效的。

inline int sum(const int &a,const int &b);

int sum(const int &a,const int &b)
{
    return a + b;
}

什么情况下使用inline
函数很简单,并且需要多次调用

什么情况不能使用inline

(1) 如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2) 如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
(3) 类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。

原文地址:https://www.cnblogs.com/qifeng1024/p/12624609.html