2016 - 2024

感恩一路有你

栈和调用函数的关系 栈用来调用函数时保护断点,局部变量为什么也入栈?

浏览量:2581 时间:2021-03-11 08:20:25 作者:admin

栈用来调用函数时保护断点,局部变量为什么也入栈?

在堆栈中按下局部变量以释放更多寄存器,这些寄存器可以灵活地用于实现特定的操作。当操作不需要引用局部变量时,局部变量在堆栈中。当操作需要局部变量时,局部变量的值从堆栈中取到寄存器。

局部变量也驻留在寄存器中,即在定义局部变量时添加寄存器。

堆栈顶部有一个指针寄存器SP。当按下堆栈时,您可以使用SP来确定某个偏移量(这些偏移量是在编译时确定的,在运行时找不到),以获取存储局部变量的位置,这样您就可以从该位置读取局部变量的值,而不必通过stack out操作获取它们的值。

函数调用过程中栈到底是怎么压入和弹出的?

例如:void fun(int a,int b,int c)调用fun(1,2,3)时:-将断点的程序指针按入堆栈-按顺序将3,2,1按入堆栈,并指定指向堆栈的参数变量指针。参数存储位置为参数变量位置-按栈保存站点-执行函数-弹出栈恢复站点-栈指针减去参数占用字节数丢弃栈中参数-栈的先进先出操作顺序适合函数的嵌套调用,而队列的先进先出操作顺序不合适。例如:(栈的操作在栈顶完成)main函数调用函数,字段参数按栈。堆栈结构:[[top of Stack][call a field][bottom of Stack

一个函数,然后调用B函数:[[top of Stack

[call a field][bottom of Stack

top][call B site][call a site][Stack bottom

从B返回时,可以得到刚进入堆栈顶部的[call B site]参数。当从返回时,[call a site]参数返回到堆栈的顶部并被使用。如果是队列,则如下所示:[[queue entry][call B site][call a site][queue exit

从B返回时,队列出口处的[call a site]参数为[call a site],因此堆栈结构适合嵌套调用和循环。

栈和调用函数的关系 方法调用栈 函数调用栈图解

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。