inline:修饰的函数为内联函数、内嵌函数
空间(内存空间)、时间(编译时间、运行时间)
以时间换空间:消耗更多编译运行时间,换取占用更小的内存。(宏函数)
以空间换时间:占用更多的内存空间,换取运行时间。(inline内嵌函数)
inline :改变函数调用的处理过程(将函数体里的语句内嵌到函数的调用地方!)
分析:
inline int add(int a, int b)//内联函数
{
int num;
int num2;
return a + b;
}
#include<iostream>
#define MAX (a,b) a>b?a:b
int main()
{
}
//宏定义
//处理阶段:是在预处理阶段完成。
//处理过程:傻瓜式替换(没有空间的分配过程)不做语法检查!! 不安全
宏定义
处理阶段:是在预处理阶段完成。
处理过程:傻瓜式替换(没有空间的分配过程)不做语法检查!! 不安全
自定义函数
处理阶段:编译时检查语法、运行时函数进行栈进栈出
处理过程:通过函数名找到函数的入口地址;给形参分配空间;传值;执行函数体的语句;函数返回;释放空间
内联函数在c++中的升级:
inline 是由编译决定,使用inline关键字只是申请编译器;
限制:
1、内联函数中不可含有循环
2、内联函数中不可能含有静态变量
3、内联函数不可为递归函数;
4、内联函数中不可含有错误处理。
选择:
1、只将规模很小(一般5个语句一下)而使用频繁的函数声明为内联函数
2、在函数规模很小的情况下,函数调用的时间开销可能相当于甚至超过执行函数本身的时间,把它定义为内联函数,可大大减少程序运行时间。
注意事项:
内联函数的定义必须出现在内联函数第一次调用之前;
加强
inline:
1、编译器决定是否内联处理
2、函数的默认参数:如果一个参数为默认参数,那么它右边的所有参数必须为默认参数
3、函数的占位符:预留函数接口
4、函数的重载:函数名命名的可读性问题
函数重载的条件:函数名相同,函数形参个数,类型或者顺序不同(相同类型没有顺序)
注意事项:函数返回值不能作为重载条件 、函数默认参数会影响重载条件
编译器如何实现函数重载? ||编译器会用自己的方式给其重命名
#include<iostream>
using namespace std;
int add(int a, int b, int c = 5)
{
return a + b + c;
}
int main()
{
cout << add(5, 6) << endl;
cout << add(4, 5, 6) << endl;
return 0;
}
#include<iostream>
using namespace std;
int aub(int a, int)
{
return a;
}
int main()
{
cout << sub(5,6) << endl;
return 0;
}
#include <stdio.h>//函数默认命名会影响重载条件
int func(int a, int b, int c=0)
{
return a + b;
}
int func(int a, int b)
{
return a + b;
}
int main()
{
func(1,2); // 哪个函数会被调用
return 0;
}