内联函数 函数的重载

来源:互联网 发布:uuu加速器网络官网 编辑:程序博客网 时间:2024/05/29 05:57

内联函数

内联函数,又称内嵌函数,内置函数。

关键字: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函数。

 

函数的重载

 

 

 

 

 

原创粉丝点击