标签: c++ assembly stack push pop
我有一个关于堆栈的快速问题,我一直想知道。
如果给变量赋值,然后将它们推入堆栈,一旦它们被放入堆栈中,它们是否仍然包含相同的值,或者值是否会变为“空”并且您必须在堆栈中更改它们?
我理解它的方式,一旦你从堆栈中弹出变量,它将返回到推送变量之前的值,对吗?但是,当它被推动时,变量是否会保留其价值?
提前致谢!
答案 0 :(得分:3)
对于assembly:除非push esp,否则推送内容对原始内容没有影响,因为PUSH指令通常会修改ESP(或sp或rsp,具体取决于当前的处理器模式。)
push esp
PUSH
ESP
sp
rsp
Pop将使用当前位于堆栈顶部的任何内容覆盖寄存器/位置的当前内容。当且仅当您的推送和弹出平衡时,这将恢复之前的值,因此您
对于c++:如果您使用移动语义,推送内容可以破坏原始内容。它可能会使事情过载,所以同样会发生这种情况,但这通常是不可取的(至少可以说)。
弹出只会从堆栈中删除一个项目。您可以从堆栈顶部复制项目(或者您可以以类似堆栈的方式使用的集合,例如vector或deque),然后单独弹出以从堆栈中删除该项目。
vector
deque