【发布时间】:2018-05-25 16:45:48
【问题描述】:
对于程序来说,局部变量是在堆栈中定义和分配的,但是,我只是想知道局部变量的定义顺序与使用它的顺序不一样。 例如,在main函数中,定义了int a b c,如前所述,a b c是在栈中分配的,也就是说如果变量a位于栈底,但是当变量先被使用时,如何将a从栈中弹出呢? 还是 ebp 指向所有变量的存储位置?
【问题讨论】:
-
存储在堆栈中的局部变量在方法返回之前不会从堆栈中“弹出”。堆栈和其他所有东西一样是内存,压入堆栈的是特定大小的保留区域,变量只存在于这个空间中,但它们只是内存访问,当方法返回时,整个内存区域都会被删除.
-
将堆栈想象成一叠文件。当一个方法被调用时,一张新的纸被放在堆栈的顶部,并且在这张纸上该方法的所有局部变量都被记下。当方法返回时,我们删除整个工作表。只要方法还在调用栈上,纸就还在。在此方法中是否不再实际使用变量并不重要。尽管这可能是一种优化,以在方法执行时减少堆栈大小,但我不确定我是否听说过执行此操作的编译器/运行时。
-
请记住,这整个事情通常被认为是低级的,大多数开发人员永远不需要知道它的实际细节。所以我的问题是,你为什么需要知道?您是否有需要解决的问题,或者您只是在寻找要学习的东西?
-
@LasseVågsætherKarlsen:纸叠类比是一个很好的类比。您为什么不将您的 cmets 转换为答案?
-
@LasseVågsætherKarlsen 您的第一条评论确实是一个很好的答案——把它变成一个答案!