为什么堆栈不会回滚

Ahm*_*med 2 c++ stack operating-system

我们研究过Stack的扩展和缩小.但在实践中它不会发生以一个从地址100扩展到0的堆栈的例子,即第一个变量变为100,然后紧接着99等等.现在当我们编写以下代码时

int main()
{
   {
      int i;
      cout<<&i;//100 is displayed on screen
   }
   {
      int j;
      cout<<&j;//99 is displayed on screen
   }
}
Run Code Online (Sandbox Code Playgroud)

现在当我们宣布i时,它会转到100,然后它的范围结束.然后j在新范围中声明,现在它应该再次具有地址100,因为我已经完成并且堆栈应该回滚但是它没有,j具有地址99.为什么?你可以解释吗??

Dav*_*nan 6

该标准没有对局部变量的存储做出这样的承诺.没有理由相信声明的顺序与它们在记忆中的排列顺序有任何关系.

它完全是在编译器的要求下如何完成的.实际上,对于您的程序,编译器可以对两个变量使用相同的地址.我希望任何体面的优化编译器都能这样做.

现在,在实践中,编译器可能会使用您所谈论的各种优化.但是,如何实现这些优化将因编译器而异.并且没有理由将您描述的简单规则普遍应用于所有函数.编译器可以为一个函数选择一个策略,为不同的函数选择不同的策略.根据其选项,编译器的行为可能不同.

当然,如果你在谈论与函数调用相关的堆栈帧,那么它就不同了.显然,当您进行新的函数调用时,会分配一个新的堆栈帧.然后当函数返回时,该堆栈帧被销毁,并且重新输入调用函数的堆栈帧.但这是一个完全不同的问题,而不是你在问题中讨论的内容.


Mar*_*som 5

在堆栈上分配空间需要一些时间,尽管非常小.编译器进行的一个非常常见的优化是分析函数内声明的变量,并在函数开始的同时为所有变量保留堆栈空间.

更聪明的编译器会意识到两个变量的生命周期不重叠,让它们共享相同的位置.