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

本文探讨了函数在C语言中的底层实现,包括调用、执行和返回三个步骤。函数调用涉及到运行时栈的使用,以实现递归调用。通过详细描述函数调用时的形式参数传递、活动记录的入栈和出栈,以及控制权的转移,解释了函数调用的具体过程。函数执行期间,R0~R7寄存器有不同的角色,遵循“调用者保存”和“被调用者保存”规则来维护函数调用的状态。
最低0.47元/天 解锁文章
1920

被折叠的 条评论
为什么被折叠?



