inline 关键字主要功能是为了 代替掉 宏代码片段。
在C++中使用关键字inline关键字声明内联函数。
inline int fun(int a,int b) { return a < b ? a : b; //如果a<b 成立 a=a 否则a=b }
#include <stdio.h> #define FUN(a,b) ((a) < (b) ? (a) : (b)) inline int fun(int a,int b) { return a < b ? a : b; //如果a<b 成立 a=a 否则a=b } int main(int argc, char *argv[]) { int a = 1,b=3; int val = FUN(++a,b); printf("Begin... "); printf("val = %d ",val); printf("a = %d ",a); printf("b = %d ",b); printf("End... "); return 0; }
如果调用宏FUN int val = FUN(++a,b); 展开就是 int val = ((++a) < (b) ? (++a) : (b)); 这里的Val = 3
而调用 fun 这个函数 int val = 2
从而说明 宏代码块有一个缺点就是宏代码块只是做内容的替换。
C++ 中inline 内联编译的限制:
1、不能存在任何形式的循环语句
2、不能存在过多的条件判断语句
3、函数体不能过于庞大
4、不能对该函数进行取地址操作
5、内联函数声明必须在调用语句之前。
内联函数:
C++编译器可以将一个函数进行内联编译
C++编译器直接将函数体插入函数调用的地方,从而内联函数没有普通函数调用时的额外开销。(压栈、跳转、返回)。
注意:C++编译器不一定满足函数的内联请求,也就是说使用inline 关键字声明内联函数可能会被编译器拒绝。从而建立内联失败
强制内联:
C++编译器提供了 扩展语法,能够对函数进行强制内联
g++ :_attrbute_((always_inline)) 属性
MSVS:_forceinline