搜索
写经验 领红包

函数调用的开销是指什么(函数调用的好处)

导语:函数调用带来的额外开销

函数调用的开销是指什么(函数调用的好处)

在编程中,函数(General function)是功能比较单一,使用比较普遍的代码块。如C语言中的printf,scanf就是最常见的函数,它们用于各类数据输出和输入,是很常用的的库函数。

所谓函数调用,就是使用已经定义好的函数。

使用函数能够避免将相同代码重写多次的麻烦,减少可执行程序的体积,但也会带来程序运行时间上的开销。

函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中,最后才跳转到函数内部执行。这个过程是要耗费时间的。

另外,函数执行 return 语句返回时,需要从栈中回收形参和局部变量占用的存储空间,然后从栈中取出返回地址,再跳转到该地址继续执行,这个过程也要耗费时间。

总之,使用函数调用语句和直接把函数中的代码重新抄写一遍相比,节省了人力,但是带来了程序运行时间上的额外开销。

一般情况下,这个开销可以忽略不计。但是,如果一个函数内部没有几条语句,执行时间本来就非常短,那么这个函数调用产生的额外开销和函数本身执行的时间相比,就显得不能忽略了。假如这样的函数在一个循环中被上千万次地执行,函数调用导致的时间开销可能就会使得程序运行明显变慢。

C++内联函数提供了另一种选择。内联函数是指用inline关键字修饰的函数。

内联函数

内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。

因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。(如果程序在100个不同的地方调用同一个内联函数,则该程序将包含该函数代码的100个副本)

以时间换取空间,或增加空间消耗来节省时间,这是计算机学科中常用的方法。

相关阅读

C语言学习笔记总结:编译、链表、指针、标准库、时间、工具

本文内容由小海整理编辑!