定义
内联函数的基本思想在于将每个函数调用他们的代码体来替换。
优点
没有函数栈帧的开销
相比较宏来说,内联还会有代码,节约内存的同时还可以调试
缺点
内联会造成代码膨胀,程序运行过慢
无法对程序库的内联函数进行二进制代码升级
在类中定义内联函数
#include<iostream>
using namespace std;
class A
{
public:
void fun(int x);//声明后想要称为内联函数,必须在实现出加inline关键字
int add(int x,int y){};//定义即隐式内联函数
};
int add(int x,int y);
//inline是一种用于实现的关键字,不是声明的关键字,要与函数定义放在一起
inline int add(int x,int y)
{
return x+y;
}
//推荐定义处加inline关键字
inline void A::fun(int x){}
int main()
{
cout<<add(1,2)<<endl;
}
编译器对内联函数的处理步骤:
1.将inline函数体复制到inline函数调用点处
2.为inline函数中局部变量分配内存
3.将inline函数的输入参数和返回值映射到调用方法的局部变量空间中
以下情况不适合用内联:
1.函数体代码较长,使得内联将导致内存消耗较大
2.函数体出现循环。那么执行函数体的代码比函数调用开销大
虚函数可以是内联函数
- 内联函数可以修饰虚函数,但是当虚函数表现为多态性的时候不能内联。
- 内联实在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行周期调用哪个代码,故虚函数表现为多态性的时候不可以内联
- inline virtual唯一可以内联的时候是:编译器知道调用的对象是哪个类,在编译器具有实际对象而不是对象的指针和对象的引用。
#include<iostream>
using namespace std;
class A
{
public:
inline virtual void who()
{
cout<<"I'm A\n";
}
virtual ~A(){}
}
class B:public A
{
public:
inline void who()//隐式内联
{
cout<<"I'm B\n";
}
};
int main()
{
//此处的虚函数who(),是通过类A的具体对象a来调用的,编译期间就能确定,可以是内联
A a;
a.who();
//此处的虚函数是通过指针调用,呈现多态性,运行期间才能够确定,不能内联
A *ptr=new B();
ptr->who();
//因为A有虚析构函数virtual ~A(){},delete会先调用派生类B的析构函数,在调用A的析构函数
delete ptr;
ptr=nullptr;
return 0;
}