inline内联函数(内置函数/内嵌函数)
前提了解:
函数调用 CPU一行行执行主调函数代码,在遇到被调用函数时,主调函数暂停,CPU去执行被调用函数的代码;当它执行完后 才返回主调函数,继续执行。这个过程有时间和空间的开销。
一个C/C++程序的执行过程可以认为是多个函数之间的相互调用过程,形成一个调用链条,链条起/终点为main()。
内联函数 在编译时就将函数调用处用函数体替换
#include <iostream>
using namespace std;
//内联函数,交换两个数的值
inline void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main(){
int m, n;
cin>>m>>n;
cout<<m<<", "<<n<<endl;
swap(&m, &n);
//相当于直接替换掉上面一行
/*int temp;
temp = *(&m);
*(&m) = *(&n);
*(&n) = temp;*/
cout<<m<<", "<<n<<endl;
return 0;
}
1.inline函数是用于实现的关键字,而不是用于声明的关键字
inline 必须与函数定义体放在一起才能使函数成为内联函数,仅将inline与函数声明放一起不起作用
2.内联函数应该放在头文件中定义
放在头文件中,其他源文件可以做一份拷贝(编译器做)
只要 inline 函数的定义在某个源文件中只出现一次,而且在所有源文件中,其定义必须是完全相同的即可。
内联函数替代宏
宏定义 #define是宏定义命令,将一个标识符定义为一个字符串,在预编译时将宏名(标识符)替换为字符串
//不带参数的宏定义--
#define PI 3.1415926
//宏名一般大写
//预编译:在编译之前,不做语法检查
//后面不加分号;
//可以用#undef命令终止宏定义的作用域
//宏定义不分配内存,变量定义分配内存
//带参数的宏定义
#define S(a,b) a*b
area=S(3,2);
//第一步被换为area=a*b; ,第二步被换为area=3*2;
宏定义弊端
#define CALL_MAX_FUN(a, b) f((a) > (b) ? (a) : (b))
int a = 5, b=0;
CALL_MAX_FUN(++a, b); //a自增2次
//f((++a)>(b)?(++a):(b));
CALL_MAX_FUN(++a, b+10); //a自增1次
//f((++a)>(b+10)?(++a):(b+10)); 因判断否
同样的调用,竟然会因为参数的不同,导致a的结果值不同。
inline内联函数替换
template<typename T>
inline void CallMaxFun(const T& a, const T& b)
{
f( a > b ? a : b);
}