内联函数(inline)
//问题: 短小的函数(1-10行) ,同时需要频繁的调用(10w次)。
//举例场景:在堆排和快排中,排序10w个数据,里面的swap函数。
//分析:由于需要高频繁性调用,导致需要不断的开辟栈帧,影响程序的运行效率,所以C语言 和 C++都有各自的解决方案:
//C -> 宏函数
//C++ ->inline(内联函数)
1、C语言中的宏函数
1.1 宏(宏常量和宏函数)的优缺点
//优点:a、宏函数提高效率,减少栈帧建立 (直接进行替换)
//缺点:a、可维护性或可读性差(宏函数复杂) b、没有类型安全检查 c、不方便调式
1.2 宏函数如何写
#define ADD(a,b) ((a)+(b))
int main()
{
//应用宏函数的几个实例:
//检测宏函数是否写的正确,带入实例看能否进行替换并完成功能(在预处理阶段,完成替换)
ADD(1,2); // ((1)+(2))
if (ADD(1,2)) //if(((1)+(2))) [这里就说明最后定义时不能加 ; ,要不就变成了if(((1)+(2));)]
{
}
ADD(1,2) * 3; // ((1)+(2))*3 [这里就体现出外面括号的重要性] { 假如没有外面的括号,就变成:(1)+(2)*3 }
int x = 1, y = 2;
ADD(x|y,x&y); //((x|y)+(x&y))[这里就体现出里面括号的重要性] { 加入没有里面的括号,就变成:(x|y + x&y)},进而导致 y+x 先进行计算了。
return 0;
}
2、C++中的inline(在符合条件的情况下,在调用地方展开)
2.1 内联函数的概念及优势
//内联函数:以inline修饰的函数叫做内联函数,编译时C++编辑器会在 调用内联函数 的地方展开,(优势)使得没有函数压栈的开销,内联函数
//可以提升程序运行的效率。
//内联函数不仅弥补了宏函数的缺点,也具备宏函数的优点 {因此在C++中基本不再建议使用宏函数,而是用inline去替代}
inline int Add(int a,int b)
{
return a + b;
}
int main()
{
cout<< Add(1,2) <<endl; //可以调整相应模式在debug版本下用反汇编观察
return 0;
}
2.2 内联函数的应用条件(特性)
//(1)inline 对于编译器而言只是一个建议,编译器会自动优化;如果定义为:inline的函数代码指令很长(大概十行左右)/存在递归等情况,编译器优化时会忽略掉内联。
//(2)inline是以 空间换时间 的做法,省去调用函数的额外开销。所以在代码指令很长(10行左右)或有递归的函数不适合使用作为内联函数。
// (节省时间,提升程序运行效率) 【代码指令很长时,不会展开inline(如果展开,会导致编译出的可执行程序增大多倍)
// Func函数 调用Func函数1W次
//
//
// 不展开inline:1W+100 (1万次call指令 + 100行Func函数指令)
// 100行指令
// 展开inline: 1W*100 (1万次调用*每次调用是100行指令)———如果展开,导致编译出的可执行程序变大很多
//
//(3)inline不建议申明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就找不到了。(所以要在 .h 文件中直接定义inline)