C++那些细节--inline关键字

一.简介

inline是个好东西,不过要注意不能乱用。在项目中看到过许多inline相关的宏定义,_forceinline,_inline等等,有许多有疑惑的地方。于是,本人强迫症发作,决定总结一下inline相关的知识。主要涉及到inline的功能,使用,以及forceinline等。还有类中的virtual函数是否会被inline等问题。

二.inline关键字


1.inline优点

inline是标准C++中提供的关键字,使用这个关键字,意思就是告诉编译器,介个函数是个内联函数。内联函数又是啥呢,简单的说就是直接将函数的内容替换到调用的位置。这样做,可以大大的省掉调用函数的性能损失。内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。 内联函数在使用时,没有函数调用的性能损失。但是却可以像函数一样,有相关的类型检查等,我们完全可以按照普通函数那样对待内联函数。

看一个例子,比如我们的类中有一个成员变量,我们在使用这个成员变量的时候,为了封装性,需要使用函数来存取这个变量。
class Test
{
private:
	int m_iID;
public:
	void SetID(int id);
	int GetID();
};

void Test::SetID(int id)
{
	m_iID = id;
}

int Test::GetID()
{
	return m_iID;
}
但是,我们这样做的话,本来一下子就可以搞定的事情,却需要通过函数来实现。虽然这样有利于封装,为了更严谨的结构,我们写的时候麻烦一些也就罢了。但是,在运行时,这样做会造成很大的调用函数的损失。如果调用成千上万次的话,每次调用都需要进行参数压栈,保存运行状态,将结果返回等一系列操作,而我们的函数这么短小,使用普通函数就有些得不偿失了,这时候,把它内联了可能是最好的选择。内联之后,我们就可以在编程的时候将它按照函数处理,而在使用的时候又没有多少性能开销,何乐而不为呢?

2.inline缺点

既然inline这么好,那么我们是不是可以任意使用inline函数呢?
凡事有一利必有一弊,inline虽然能够很好的提升性能,但是,它的实现是通过将每一个函数的调用都以函数本身来替代进行实现的。这样做会有一些弊端。
(1)程序体积增大:函数调用次数越多,我们插入的内容就越多,代码体积势必会增大。程序体积增大的话,会导致额外的虚拟内存换页等行为,降低指令高速缓存的命中率。这样的话,inline反倒降低了效率。
(2)不利于动态升级。inline函数一般都在.h文件中,将声明和定义写在一起,普通函数修改函数内部内容时只需要重新连接就可以,但是内联函数如果修改的话,所有用到该头文件的内容都需要重新编译。
(3)不利于调试,内联函数的实现是拷贝过去的话,那么真正调用的时候,那里根本就不是一个函数,我们没有办法去调试一个内联函数。所以,编译器在编译debug版本的时候,是不会将内联函数inline处理的,而是当做一个普通的函数来处理,这样我们就可以调试了。

3.怎样进行inline

inline这么好,那么肿么进行inline操作呢?inline有两种形式,一种是显式inline,另一种是隐式inline。
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值