C++:inline

inline

inline是C++提供的一个关键字,它用于函数定义以前,表示把函数定义为内联函数。内联函数的含义是:在函数调用点把函数体直接展开,取代函数调用。程序员

inline int getZero() {
    return 0;
}
int a = getZero();

若是上述函数没有定义为inline,那么在声明a时,程序实际上的工做是,把getZero()函数压入栈中,执行函数获得返回值0并出栈,最后把0赋值给a。在定义为inline以后,编译器会把做为内联函数的函数体在调用点,也就是在声明a时展开,直接获得结果0并赋值给a,省去了函数入栈和出栈的调用过程,提高了性能。函数

那么若是是复杂一点的内联函数呢?性能

inline int get(int a, int b, int c, int x) {
    return (a * x + b) * x +c;
}
int b = get(1, 2, 1, 4);

比起以前的getZero()get()函数多了许多运算,它在调用点也会被展开为int b = (1 * 4 + 2) * 4 + 1;。可想而知,越复杂的函数体内联展开越困难。code

由此也引出了内联函数定义的特色:递归

  • inline关键字对编译器起建议做用,是否内联编译由编译器决定。
  • inline关键字出如今函数声明处不起做用,出如今函数定义时有效。
  • 逻辑复杂的函数定义为内联是无心义的,如嵌套调用、递归等。
  • 类内定义的函数都是隐式内联的,类外定义须要显式加上inline关键字。
// inline无心义
inline int f1(int x) {
    if (x == 0 || x== 1) return 1;
    return f(x - 1) + f(x - 2);
}

// inline无心义
inline int f2();

class LiF {
public:
    LiF() = default;
    LiF(int _lif);
    void set(int _lif) { lif = _lif; } // 类内隐式内联
    int get();
private:
    int lif;
}

LiF::LiF(int _lif): lif(_lif) {} // 无内联

inline int LiF::get() { return lif; } // 类外显式内联

既然内联能够提升效率,那为何不把全部函数都定义为内联呢?这个问题也不难解答。内联的前提是能够在调用点展开,显然以前提到的复杂函数时没法展开的;而若是某次内联函数执行消耗的时间远长于调用的消耗,那么此次内联也是失败的。再者,程序效率提高的背后必然有更大的内存消耗,内联带来的效率提高是经过复制代码到调用点实现的,这显然就增长了代码量。那么这就要求程序员谨慎地使用inline内存

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息