在C中可以使用#define提高执行效率,但是容易出错,而在C++ 支持函数内联,其目的亦是如此。
(1)inline的工作原理:
对于任何内联函数,编译器在符号表里放入函数声明(包括名字,参数类型,返回值类型)。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表中。在调用一个内联函数时,编译器首先检查调用是否正确,比如进行类型安全检查,进行类型转换等。如果正确,内涵函数的代码将会直接替换函数调用,于是省去了函数调用的开销。
这个与#define是不同的,因为#define不能进行类型安全检查,或者自动类型转换。如果内联函数时成员函数,对象的地址this会被放在合适的地方,这个也是预处理不能办到的。
(2)inline的编程风格:
关键字inline必须与函数定义提放在一起才能使函数成为内联,仅将inline放在函数声明中是无效的,比如:
inline void foo(void); // 仅与声明放在一起无效
void foo(void)
{...}
与定义体放在一起是有效的,比如:
void foo(void);
inline void foo()
{....}
这样可以看出,inline是一种用于“实现”的关键字,但是个人感觉,在声明中也写上inline,虽然这样可能导致声明与定义混为一谈,但是这样很容易让你的小伙伴们一目了然。
(3) inline的使用:
在一定程度上,使用inline的确可以提高函数的执行效率,但是依然建议慎用内联。原因在于内联是以代码复制为代价的,仅仅省去了函数的调用开销,但是执行函数体内代码的时间变长。所以建议:inline函数体内的代码不宜过长。
当然,一些编译器会根据函数的定义体,自动取消不值得的内联,不过目前我还没注意到。等发现了再做补充^_^