内联函数
常规函数调用过程:
调用时,根据函数地址,跳到函数的代码空间,执行指令,执行完,再跳转到调用的位置
综合:来回跳跃+记录跳跃的位置==一定的系统开销(资源+时间)
内联函数:
1作用:用相应的代码,替换调用,比常规函数快,代价是占用更多内存
2过程:由主函数向下执行,到内联函数调用时,将调用的代码替换成函数内部的内容,省去了来回跳转的部分。
3声明方式
普通函数前面加上inline
的关键字
inline void fun()
{
int a = 12;
char b = 's';
float c = 12.1f;
}
//主函数调用
fun();
若有函数原型,则都要加上inline
inline void fun();
inline void fun(){}
4常规函数和内联函数如何选择?
(1)根据特点决定 (时间和空间)
a.看实际需要 b.看性价比
(2)根据实际情况
函数代码少,流程直接,调用频繁用内联函数(比如在循环里)
for (int i = 0; i < 5; i++)
fun();
(3)编译器不一定会通过内联函数编译
a.函数体过大
b.递归不能是内联函数
执行效果:按常规函数编译,这是编译器的特性,但并不是所有编译器都有这个特性。
5.内联函数与宏同样是替换,也有区别
#include<iostream>
using namespace std;
#define SUM(x) x*x //定义宏
inline void sum(int i)
cout << i*i << endl;
int main()
{
//宏仅仅是单纯的替换,不运算,即2+3*2+3
//写成#define SUM(x) (x)*(x) 就好了
cout << SUM(2 + 3) << endl;
//运算,先计算成5,再5*5
sum(2+3);
system("pause");
return 0;
}
6.类与内联函数
(1)类内声明的常规的函数都是内联函数,只不过是隐式表示
class Cstu{
public:
void stu() //内联函数 隐式表示
cout << "隐式内联函数" << endl;
inline void stu1() //显式表示
cout << "显式内联函数" << endl;
void stu2(); //这样的就不是内联函数
};
void Cstu:: stu2()
{
cout << "不是内联函数";
}
(2)注意
内联函数一般把定义写在头文件里
内联函数可以有多个定义,但定义必须完全一致