在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函数主要有以下这些优点:
避免函数调用开销;
节省了函数参数入栈出栈的开销;
节省了函数返回值的开销;
当然inline函数也有一些缺点:
会使代码膨胀,增加的可执行文件的体积;
inline函数改变后会让所有使用该函数的代码需要重新编译;
可能使头文件更加臃肿(inline函数经常实现在头文件里);
可能导致潜在更多的分页错误;
使用inline的注意点
inline关键字只是一个给编译器的建议,而并不是强制内联。编译器会自己决定要不要内联。标了inline的编译器也不一定会内联,没有标inline的编译器也可能会内联;
与宏相比,inline对debug更加友好;
所有直接在class声明的时候直接给出定义的函数都是默认inline的,不管有没有inline关键字;
虚函数通常不应该是inline的;但是在某些情况下,例如在同一个函数体中声明并构建一个对象,这样的情况下编译器非常明确对象的类型,虚函数也是可以被inline的;
模板类的方法虽然都是在头文件中给出实现的,但不总是inline函数;
大多数编译器会针对递归函数做inline处,并可以控制inline的深度。例如msvc的-inline_recursion(on)或者gcc的--max-inline-insns-recursive;
如果inline函数被多处引用,一定要定义在头文件中,否则编译器在展开函数时无法找到函数的定义就会报link错误;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。