关于inline关键字,可以说是一个简单关键字,先直接总结一下这个关键字要领吧, 再说为什么他是宏的一种很好的补充
1:在类中声明同时定义的成员函数,自动转化为内联函数
也就是说想如下函数d实际上在编译的过程就转化为内联函数。
class A()
{
void c();// not a inline function;
void d(){ print("d() is a inline function.");}
}
2: inline关键字必须和函数体定义放在一起才可以实现内联,仅仅将inline放在函数声明之前不起任何作用。
3:inline指令就象register,它只是对编译器的一种提示,而不是命令。也就是说,只要编译器愿意,它就可以随意地忽略掉你的指令,事实上编译器常常会这么做。
4:内联函数的运行速度比常规函数快一些,但代价是需要占用更多的内存空间,若在程序中多个地方调用同一个内联函数,该程序需要包含有该函数代码的多次拷贝。由于在编译时将函数休中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
5:内联函数要特别慎用,实际上内联函数应该里面只有极少的简短代码,而且通常不含switch以及类构造析构过程。
内联函数是宏的一种很好的补充
注意:虽然内联函数和宏都是用代码量换执行效率,以直接展开代码方式来代替普通函数,但是内联有以下优点
1.内联函数在运行时可调试,而宏定义不可以;
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
4.宏在有时会发现无法预料的错误如下:
#define MAX(a,b) ((a)>(b)?(a):(b))
int a=1,b=0;MAX(a++,b); //a被增值2次