c++基础:inline

定义
内联函数的基本思想在于将每个函数调用他们的代码体来替换。
优点
没有函数栈帧的开销
相比较宏来说,内联还会有代码,节约内存的同时还可以调试
缺点
内联会造成代码膨胀,程序运行过慢
无法对程序库的内联函数进行二进制代码升级

在类中定义内联函数

#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.函数体出现循环。那么执行函数体的代码比函数调用开销大

虚函数可以是内联函数

  1. 内联函数可以修饰虚函数,但是当虚函数表现为多态性的时候不能内联。
  2. 内联实在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行周期调用哪个代码,故虚函数表现为多态性的时候不可以内联
  3. 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值