一、内联函数(inline)简介
内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。
二、内联函数和宏的区别
宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。换句话说,调用内联函数和调用正规函数是等价的,差别仅仅是更快。你可以像调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
三、使用内联函数需要注意的地方:
1、inline函数不要超过10行代码,且不能包含循环、switch、if语句.
2、在一个c文件中定义的inline函数是不能在其它c文件中直接使用,推荐把inline函数定义在头文件中。
3、不要过度使用inline函数定义,尤其对大函数来说.当我们过度使用inline函数,会造成程序文件变大,性能降低。内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。程序文件变大是肯定的,但为什么性能会降低呢,inline不是为了提高性能吗?使用的方式不正确性能不能提高,反而会下降。现在的CPU上都有cache,紧凑的代码在chache中保存的时间更长,这样cache命中的机会更高。
四、实例学习
1、define_inline.cpp代码
#include <iostream>
using namespace std;
#include <stdio.h>
#define define_absolute(i) \
( (i) >= 0 ? (i) : -(i) )
inline int function_inline(int i)
{
return i>0?i:-i;
}
void main()
{ int j,m;
char c=0;
printf("define and inline\n");
j=100;
m=function_inline(j++) ;
printf("function_inline(j++)=%d j=%d\n",m,j);
j=100;
m=define_absolute(j++);
printf("define_absolute(j)=%d j=%d\n",m,j);
j=100;
m=define_absolute(++j);
printf("define_absolute(j)=%d j=%d\n",m,j);
function_inline(c);
}
2、测试结果,看下面的运行结果的不一样,可以大概了解宏和inline两者的不一样了。