内联函数
内联函数关键字inline,所谓的内联函数和普通函数的区别主要是在函数调用上的区别,内联函数的调用和宏函数有点类似,他在调用点会将代码展开,而不是开辟函数栈。举一个简单的例子。
int fun(int a,int b)
{
return a>b?a:b;
}
int main()
{
int a;
cin >> a;
int b;
cin >> b;
int c = fun(a,b);
cout << c <<endl;
}
这时在主函数中就会把fun(a,b)替换成a>b?a:b;这样的代码,这样与普通函数相比少了其中的函数栈的开辟,这样能节约大量的空间。
在函数需要频繁的调用一个函数时比如循环里面调用一个函数,此时调用函数的话会不断的调用函数入栈,造成栈空间和栈内存的大量消耗,内联函数的出现便是专门解决这样的问题的,内联函数只会进行代码的替换,节约了大量的栈空间。
内联函数的使用:
先说在C语言中内联函数的使用,c语言中inline关键字必须要和函数定义体放在一起,
//正确的使用
int Fun(int a, int b);
inline int Fun(int a, int b)
{
return a>b?a:b;
}
//错误的使用
inline int Fun(int a, int b);
int Fun(int a, int b)
{
return a>b?a:b;
}
比如上面的例子,第一个为正确的使用inline关键字和函数定义体放在一起,第二个错误是需要被注意的inline关键字和函数声明放在一起并不会变为一个内联函数。
在C++中的内联函数分为两种,显式的内联函数和隐式的内联函数。在类声明的内部声明,而在类声明外部定义叫做显式内联函数。在类声明的内部定义,叫做隐式内联函数。
虽然内联函数的调用可以节约栈内存的消耗那也需要根据情况来使用内联函数。当执行内联函数函数体内代码的时间,相比于函数调用的开销较大时就不需要去定义为内联函数。因为内联函数是以复制代码的形式来工作的,当代码量很大时他也会消耗内存。
不能使用内联函数的场景:
1、当函数体的代码很长时,建议小于五行的小函数。
2、当函数体内有循环时,此时使用内联函数不如直接函数调用消耗的小。
3、当出现递归时不能使用内联函数。
宏函数
所谓的宏函数基本作用和内联函数的作用是相同的。他同样也是在调用点代码的替换。
普通函数
int Fun(int a,int b)
{
return a>b?a:b;
}
宏函数
#define Fun(a,b) ((a)>(b)?(a):(b))
内联函数和宏函数的区别
1、编译器会对内联函数的参数类型做安全检查或自动类型转换,而宏定义则不会,他只是进行单纯的文字替换,不会做任何类型的检查
2、内联函数在运行时可调试,而宏定义不可以。
3、内联函数可以访问类的成员变量,宏定义则不能
4、在类中声明同时定义的成员函数,自动转化为内联函数。