内联函数:在C++中,以inline修饰的函数叫做内联函数,编译时C++编译器会调用内联函数的地方展开,没有函数压栈开销,内联函数提升程序运行的效率。
基本思想:将每个函数调用以它的代码体来替换。
内联函数在 C++ 中的地位是用来替换 C 中的宏代码块
内联函数的注意事项:
(1)内联函数是以空间换时间的做法,省去调用函数的额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联。
(2)inline对编译器而言只是一个建议,如果定义的函数体内有递归/循环等,编译器优化时会自动忽略掉内联。
(3)inline必须与函数定义放在一起,才能成为内联函数,仅将内联放在声明前是不起作用的。
(4)一般情况下,内联函数只会用在函数内容非常简单的情况,如果内联函数代码过多会造成可读性差等问题。
内联函数的声明:
(1)内联函数可以在一开始仅声明一次。
(2)内联函数必须在调用之前被声明或定义,因为内联函数的代码必须在替换之前已经生成被替换的代码。
(3)在实现的时候可以不用加inline。
递归函数不能被声明为内联函数
内联函数的优点:
(1)没有开栈、清栈操作;
(2)不生成符号;
(3)调用点把代码直接展开;
(4)相对于宏来说,内联有代码,节省内存的同时可以调试。
内联函数的缺点:
(1)以代码膨胀为代价;
(2)造成程序运行过慢;
(3)想对程序库中的内联函数进行二进制代码升级是不可能的。
内联函数的特征:
1、内联函数具有普通函数的特征(参数检查,返回类型等);
(1)类型更加安全;
(2)C++ 提供各种方式让大家摒弃 C 中不好的一些特性,内联函数就是其中之一;
2,函数的内联请求可能被编译器拒绝;
(1)可以通过配置的方式让编译器支持内联函数的请求;
3、函数被内联编译后,函数体直接扩展到调用的地方;
(1)如果内联成功,其效率上可以和宏代码块媲美,且其在类型上比宏代码块安全很多,因此在 C++ 编程中,首选内联函数;
(2)宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用;
内联函数和宏定义:
(1)宏定义可以替换小函数,但是有缺陷。
(2)宏定义告诉编译器简单的替换代码,不检查参数类型。
(3)如果涉及到运算的时候宏定义不能代表程序员的意图。
(4)宏定义的作用往往可以用内联函数替代,并且相比具有了检查函数的作用。
为什么inline能够很好的取代预定义?
(1)inline定义的内联函数,函数的代码在使用时直接被替换,没有调用开销,提升了效率。
(2)类的内联函数也是函数,编译器在调用时会检查它的参数,消除隐患
(3)定义在类内的成员函数默认定义为内联函数。可以使用所在类的保护成员和私有成员。
内联函数和普通函数的区别:
内联函数和普通函数最大的区别在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个拷贝; 而内联函数则不需要进行一个寻址的过程,当执行到内联函数时,此函数展开(很类似宏的使用),如果在 N处调用了此内联函数,则此函数就会有N个代码段的拷贝。
内联函数示例:
#include<iostream>
using namespace std;
inline int max(int,int);
int main()
{
cout<<max(3,5)<<endl;
system("pause");
return 0;
}
inline int max(int x,int y)
{
return x>y?x:y;
}
关键字inline将函数max说明成内联函数。其使用方式和一般函数一样,只不过在程序执行时并不产生实际函数调用,而是在函数调用处将函数代码展开执行。