1

在C语言中,宏函数经常被用来优化代码以降低函数调用的开销;而在C++中,通常更建议使用inline关键字而不是宏函数来实现相同的作用。

什么是inline function

inline function中文翻译叫内联函数,即使用inline关键字来告诉编译器可以在代码中展开函数实现,编译器会在编译期使用函数定义来替换函数的调用。

inline函数的使用方法

inline函数的使用方法非常简单,在函数定义的前面加上inline修饰即可。

例如:

class Foo
{
    public:
        inline int bar(int a, int b);
}
int Foo::bar(int a, int b)
{
    return a + b;
}

为什么要使用inline呢?

inline函数主要用来使一些实现比较简单、调用频繁的函数内联化,以降低这些函数调用的开销。
inline函数主要有以下这些优点:

  1. 避免函数调用开销;

  2. 节省了函数参数入栈出栈的开销;

  3. 节省了函数返回值的开销;

当然inline函数也有一些缺点:

  1. 会使代码膨胀,增加的可执行文件的体积;

  2. inline函数改变后会让所有使用该函数的代码需要重新编译;

  3. 可能使头文件更加臃肿(inline函数经常实现在头文件里);

  4. 可能导致潜在更多的分页错误;

使用inline的注意点

  1. inline关键字只是一个给编译器的建议,而并不是强制内联。编译器会自己决定要不要内联。标了inline的编译器也不一定会内联,没有标inline的编译器也可能会内联;

  2. 与宏相比,inline对debug更加友好;

  3. 所有直接在class声明的时候直接给出定义的函数都是默认inline的,不管有没有inline关键字;

  4. 虚函数通常不应该是inline的;但是在某些情况下,例如在同一个函数体中声明并构建一个对象,这样的情况下编译器非常明确对象的类型,虚函数也是可以被inline的;

  5. 模板类的方法虽然都是在头文件中给出实现的,但不总是inline函数;

  6. 大多数编译器会针对递归函数做inline处,并可以控制inline的深度。例如msvc的-inline_recursion(on)或者gcc的--max-inline-insns-recursive;

  7. 如果inline函数被多处引用,一定要定义在头文件中,否则编译器在展开函数时无法找到函数的定义就会报link错误;


Keybord_dancer
387 声望6 粉丝