话题引入
这是我第一次跨越四五百公里去参加别的学校的招聘会,总体感受:准备不足,有点惨烈。面试第一家,在我介绍完是谁什么学校什么专业应聘什么之后,面试官直接技术面了。当时有点蒙,回答得不是很好,特别时被问到这个内联函数问题时,我压根不熟悉,之前也只是模仿人家使用过几次inline关键字罢了,所以显然哦吼完蛋。哎,可惜了,不过就当积累经验吧,也基于此作此文记录记录。
注:本文是在参考多篇博文的基础上总结出来的,而非一些实验验证得出来的,所以个别细节方面如果有错误欢迎指正~
内联函数是什么
内联函数,百度百科中定义:在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(或在线扩展)。不知道你怎么感受,反正我是稀里糊涂的,好在看了多篇网友博文的介绍总算有了较为清晰的理解了。
首先,内联函数,它是一种编程语言结构,但与我们的普通函数不同,这种结构是给编译器用的,在编译过程发挥作用。
那怎么发挥作用呢?也就是编译器会如何使用内联函数呢?总体上讲有把它展开(类似带参宏展开)和把它当做普通函数看待(此时失去内联作用)两种。我们本意当然是第一种啦,而后面一种应该是编译器的一些优化设计。所以我们就看第一种——内联函数如何展开吧。它类似带参宏定义展开,也就是在编译过程中他会以一种复制黏贴内联函数体内部代码的方式到调用处展开,所以会使得代码总量有些增加。然后,在调用处展开了之后,它就会像其他非函数调用的代码那样被执行,但此时由于不是函数调用,所以就没有了函数调用固有开销(如参数传递、保存上下文)。
另外,也有博文说到在源代码实现上内联函数机制是通过宏定义实现的。
为什么需要内联函数
当函数体十分简短,我们调用它时函数调用的固有开销(参数传递、保存上下文)会大于函数体内部代码执行所占的开销。也就是说我们要调用一个函数,在真正执行函数体内部代码之前所做的准备工作所占时长都比我们真正执行函数体内部代码所占的时长还多了。那样的话调用这个函数就有些不值得啦,一次两次看不出,但频繁调用的话就会很浪费资源了。
那怎么办?直接用一句两句代码(非函数调用)实现就可以了。但我们又想要层次结构分明之类的,又或者这些与参数有关之类的,直接代码写死不好,那怎么办?那就我们主角——内联函数出场了。
内联函数怎么用
以下情况适合使用内联函数
(1)函数体很简短,里面没有循环、switch等复杂的结构控制语句。
(2)函数没有直接递归调用自身。
如果有上面那些情况,就不能或者不适合使用内联函数啦。
内联函数与(带参宏)宏定义的区别
(1)内联函数在编译过程展开,而宏定义在预编译过程展开。
(2)宏定义是简单的文本替换,而内联函数是直接被嵌入到目标代码中去的。
(3)使用宏定义时要小心处理宏参数,一般要用括号括起来,否则容易出现二义性。而内联函数没有这种二义性。
(4)宏展开是不作参数类型检查的,而内联函数是会作参数类型检查且还有返回值的类型检查。
内联函数与普通函数的区别
(1)普通函数调用需要到函数入口地址去执行,而内联函数不用寻址直接在那儿执行就可以了。
(2)内联函数有一定的限制,参考上面的“怎么使用内联函数”。