新角度解读C++内联函数的前世今生(上)(详细必看)

引语:

首先在谈内联函数之前,我们先来讨论下C语言中是如何做的?

我们必须明白一点,在C语言中是没有内联函数的存在的,那么类似于内联函数作用的是什么呢?

答案是宏函数,他会在编译期间进行宏替换,达到函数的效果。

那么为什么C语言中要使用宏函数呢?

答案是某些函数需要频繁的调用,会消耗大量的栈帧空间,每次使用都需要调用这是非常麻烦的,效率很低下。那么需求便出现了,怎么提高效率?答案是采用宏函数,在预编译阶段,编译器将其替换,因为少了调用的过程,没有栈帧消耗,所以效率便有了很大提高。

那既然宏函数可以提高运行效率,为什么并不常用?

答案是他有三个非常明显的弊端。

其一:不能调试。这是非常痛苦的,出了问题你只能用眼睛去看,因为其在预编译阶段已经替换完毕,你在VS的debug版本下是看不到这一过程的。

其二:没有安全检查。因为是直接替换,他不会关注你写的是否正确,一些显式的语法错误都不会报警。换言之,在应用宏时,你想写什么就可以写什么,但通不通过是另外一方面。

其三:非常容易写错:你只能不断加括号加括号,只有注意注意再注意。

当然,在这里我说的很简单,并没有对宏做一个全面的分析,可以参考我C语言专栏专门写宏的一篇文章。


出世:

在这种情况下Inline函数应运而生。

其实我们能发现的是,在C++中是不建议你写宏的,从这里也可以看出一二,我们看这样一个例子:

 编译器建议你用const int A=10来代替,为什么?因为宏的弊端太多。

我们能发现的是C++中对于宏定义建议用const来代替,对宏函数建议用inline函数来代替,C++逐渐取代了宏的功能。 


回归正题,现在我们具体介绍什么是inline函数?

inline函数的基本格式是在函数定义前加上inline关键字,例如:

#include<iostream>
using namespace std;
inline void test()
{
    cout << "hello world" << endl;
}
int main(void)
{
    test();
    return 0;
}

 inline函数是一种以空间换时间的做法,如果编译器将函数当做内联函数处理,在编译阶段,会将函数体直接替换为函数调用的内容。

我们怎么去验证呢,我在这里调出了其汇编代码供以阅读:

 是不是大吃一惊,它还是去call了呀,那博主你是不是说的是错的?

其实并不是,在VS的debug版本下,是不会做替换的,仍然按照普通函数的使用方法,因为如果改成内联,你以后改错时就没有办法调试了,因为直接替换,你进不去函数内部。

那我们应该怎么做呢?

可以按照以下步骤:

 

进行完上述操作我们再来看看结果:

 是不是非常神奇呀,少了call这个环节,这也就证明了并没有进行函数调用。

下篇我将详细解读inline函数的特性并附带一个C++循环小技巧,不要走开呀,下期更精彩,码字不已,多多关注,感谢!

新角度解读C++内联函数的前世今生(下)(详细必看)_秋枫晨语的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值