内联函数
内联函数,又称内嵌函数,内置函数。
关键字:inline
C不支持内嵌函数
内联函数就是小型函数,牺牲空间来节省函数调用的开销(节省运行时间,却增加了代码长度),一般用作比较小的函数,即函数内部没有循环、开关语句等。
内联函数被发明出来就是为了取代C中的宏,因为宏是单纯的替换而没有类型检查所以经常出毛病,
比如:#define MAX(a, b) (a) > (b) ? (a) : (b)
如果你在代码中这样写:
int a = 5, b = 10;
int max = MAX(++a, b); // a自增了两次
int max = MAX(++a, b+10); // a自增了一次
a的自增次数竟然由与其比较的数字的大小来决定!?这肯定不是你想要的结果。所以最好的办法是这样:
template <class T>
inline T max(const T& t1, const T& t2)
{
return t1 > t2 ? t1 : t2;
}
这样的话如果你这样写:int max = max(a, b);其实就被替换为了:int max = a > b ? a : b;
虽然看起来宏差不多,但是比宏多了类型检查,而且内联函数使用的是真正的函数的特性,而不是宏的function-like,模拟函数的功用。内联函数是为频繁使用、并且过程不大的小型函数设计的,我说了它是以牺牲代码空间来节省函数调用的开销,内联函数使用不当就会造成代码膨胀,所以使用它一定要小心。建议(书上抄的):For function-like macros, prefer inline functions to #defines.
一般的函数调用在转到被调用函数之前要记下执行时的指令地址,保护现场,执行完成后还要恢复现场。这些都是要花费一些时间的如果有的函数不是很长(一般是5个语句一下)频繁调用就会降低程序执行效率,这时C++中一般使用内联函数。
但并非一旦制定inline,编译系统就必须这样做。假如系统包含循环语句和switch语句的函数或一个递归函数,一个大于1000行的函数,编译器就会忽略inline声明,按普通函数处理。
只有规模小又被频繁使用的简单函数才适合声明inline函数。
函数的重载