C++_inline关键字


inline关键字

在函数声明和定义加上,使之称为内联函数。如果一些简单的函数直接在类中声明并且定义,编译器可以将其优化为内联函数。

注:内联函数可以减少函数的执行时间:原因是它可以在使用时直接进行替换(像宏一样展开),从而避免出现参数压栈、代码生成等操作,但是如果函数体过大,编译器就不会将其作为内联函数,即使加了关键字inline,同时内联函数不能递归。

inline关键字声明的函数依旧是函数,所以会有类型检查,可以消除C语言宏的一些缺点。

关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。

示例

#ifndef EXAMPLE_H
#define EXAMPLE_H
 
#include <atomic>
 
// function included in multiple source files must be inline
inline int sum(int a, int b)
{
    return a + b;
}
 
// variable with external linkage included in multiple source files must be inline
inline std::atomic<int> counter(0);
 
#endif
#include "example.h"
 
int a()
{
    ++counter;
    return sum(1, 2);
}
#include "example.h"
 
int b()
{
    ++counter;
    return sum(3, 4);
}

注意

慎用 inline

内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着”内联”这个关键字吗? 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。

以下情况不宜使用内联: (1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。 (2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如”偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。

参考

百度百科-验证

inline specifier - cppreference.com


文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录