C语言函数的底层实现

本文解析了C语言中函数的执行流程与栈的工作机制,包括程序计数器的作用、栈帧的概念及局部变量如何存储与释放等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【动画详解】C语言 函数基础及其底层原理_哔哩哔哩_bilibili

我们所写的代码实际上是保存在一段连续的内存空间中,所以处理器为了保证代码能够不间断的执行下去,必须使用一定的手段来确定下一条指令的地址,这便是程序计数器PC

1.程序计数器中永远存放下一条指令的地址,从而为CPU指明方向(把CPU想象成为一个蒙着眼睛只会干活的人)。所以如果想要CPU跳转到某个位置,只需要修改程序计数器PC的值,变成你想要跳转的目的地址即可。

2.顾名思义就是古时候暂时安置人和货物的地方,即客栈。也就是数据暂时存放的地方。

栈就像是一个桶,先进后出。(这里指的是增加和删除只能在栈顶,访问还是可以通过随机访问的方式访问,即可通过地址直达数据)计算机里的栈占据一片连续的内存空间8-10M,地址最大的地方=栈底(第一步),地址最小的地方=栈顶(最后一步,即最后入栈的数据所在的地址)

 

 这样设置是因为程序都是由运行在入口函数main函数里的其他函数实现的,因此程序就需要由一个函数调到另一个函数运行,这时候就需要由底层来修改程序计数器的值,来实现这样的跳转。

并且为了保证跳转完了可以回来,在跳转完之后,之前函数里面的变量和本来下一条需要执行的指令的地址就需要被保存起来,这样跳转回来的时候才能正常的运行下去,并且跳回来的时候,之前跳过去的地方所属的内存需要被释放掉,那么使用这样的结构就很好的解决了这个问题。简而言之,是因为:1.跳转前需要程序计数器来决定调到哪里去;

                    2.跳转后需要面对回来之后从哪里开始执行+刚刚跳过去的地方需要被释放内存的问题

 

执行的过程:

    当执行的时候,函数里面的局部变量先被压入栈中;

                            当跳到函数里面的其他函数的时候,会把以后要跳回来的返回地址压入栈中,这样当它从马上要去执行的那个函数回来的时候,就知道从哪里开始继续之前的执行。那么,这个返回地址和之前压入栈的它的局部变量,就称为栈帧(相当于这个函数它自己的储物柜)栈帧只属于本函数它自己,它是对其他函数不可见的。

      那么,当它要跳去的那个函数被执行的时候,这个函数它自己以及其他所有调用它的函数,都是被挂起的,不会被执行。(即相当于给自己刚刚的储物柜上锁了,遮起来;马上要执行的里面的那个函数,就在我身上执行,反正它执行完了要被释放,而且我被挂起了也妨碍不到我,反正它执行完了就要走的,要被释放的)

    而当那个马上需要跳过去的那个函数被开始执行时,它只需要为自己的局部变量分配新的存储空间即可,当它离开(执行完毕)的时候,任何它之前分配的存储空间都可以被释放。

 

 

 之后计算出结果,将计算结果保存在一块寄存器里。

然后开始扫尾,开始将x,y出栈,然后CPU在Q函数的栈帧里面取指取到“返回地址”这里的时候,通过修改PC的值为这个返回地址便回到主函数中。这样就结束了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值