函数是什么,怎么用这个就不多说了,基础中的基础,大家都知道。
说一说函数的底层实现原理。
C语言中,函数调用包括三个步骤:
1.调用,调用者将参数传递给被调用者,并交出控制权。
2.执行,被调用者执行任务。
3.被调用者返回结果,并将控制权交还给调用者。
调用机制实现中,函数必须是“调用者无关的”,因为一个函数可能被不同的调用者调用。
运行时栈
首先,函数执行之前,必须在内存中为该函数的局部变量分配空间(其实就是存放函数的活动记录,局部变量都是位于活动记录中)
那么活动记录的内存空间怎么分配?
1.编译器负责分配,即在程序运行时,一个函数的活动记录的内存位置是固定不变的,这样会有什么问题呢?递归无法使用了,因为函数调用自身会导致调用者的活动记录的空间数据被新的调用给覆盖了,导致数据错乱。
2.函数在被调用时,每调用一次就分配一次内存空间。函数返回时,则将该活动记录空间返还,以供其他函数调用使用。这样的好处就是可以实现递归,当然实现相对会变得复杂。像C一样支持递归的语言,基本都是按照这个方案实现的。
为了降低方案2实现的复杂性,我们需要借助于“栈”,根据栈的特性,我们可以很容易的维护整个调用过程中的状态。
实现机制:
函数调用时,底层需要做很多事情:形式参数传递,活动记录的入栈和出栈,控制权在函数之间的转交。
具体步骤:
1.调用者将参数拷贝到被调用者所能访问的内存区域。将参数