需要性:函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作都需要一些时间开销。有些函数使用频率高,但代码却很短。
工作原理:编译器看到inline后,为该函数创建一段代码,以便在后面每次碰到该函数的调用都用一段代码来替换。
优点:减少函数调用的成本
限制:
1. 内联函数中,不能含有复杂的结构控制语句,如switch和while。如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码。
2. 递归函数是不能被用来做内联函数的。
3. 将大多数inline函数限制在小型、被频繁调用的函数上。
内联函数只适合与只有1到5行的小函数。对于比较长的函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。
-----------------------------------------------------------------------------------------------------------------------------------
内联函数与宏定义:
1. 宏定义可以代替小函数定义,但是有缺陷:
宏只是告诉编译器简单的替代代码,不检查参数类型,往往造成语句的实际结果不能代表程序员的意图
2. 宏的作用可以用内联函数代替:
#define MAX(a, b) (a > b ? a : b)
通过一个内联函数可以得到所有宏的替换功能和所有可预见的状态以及常规函数的类型检查:
#include <iostream>
using namespace::std;
#define MAX(a, b) (a > b ? a : b)
#define square(x) ((x)*(x))
inline int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int a = 55, b = 4;
int e = square(2+3);
cout << e << endl; // 25
int c = max(a++, b); // 调用函数,传递a的副本,再a加1
cout << c << endl; // 55
cout << a << endl; // 56
int d = MAX(a++, b); // 宏定义 a++ > b ? a++ : b
// 56 > 4 再a加1,输出57,再a加1
cout << d << endl; // 57---所以最好使用内联函数
cout << a << endl; // 58
return 0;
}