引语:
首先在谈内联函数之前,我们先来讨论下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++循环小技巧,不要走开呀,下期更精彩,码字不已,多多关注,感谢!