繁体   English   中英

在C ++中清理堆栈

[英]clean stack in c++

我们如何清洁堆栈...

return语句用于从函数中退出。 现在

if (m1.high_[0] < m2.low_[0]) return FALSE;

这里它具有m1和m2两个点,分别具有high [0],low [0],low [1]和high [1]值。

现在,如果我们使用return with语句,那么将清理堆栈..我的意思是带有if条件的return语句用于清理堆栈..是吗?

您不会真正“清理”堆栈。 发生的所有事情都是将堆栈指针重置到调用程序堆栈存储的顶部。

从该程序调用的所有后续函数都将被赋予与您的程序相同的堆栈指针(包括程序设置的任何值,这就是为什么初始化自动存储很重要的原因!)

相反,当您的程序调用一个函数时,被调用的函数将被赋予刚好在堆栈的最后一块之后的堆栈指针,并且,如果您调用多个函数,则它们都将以相同的堆栈指针结尾。


为了阐明C C ++程序支持三种类型的存储分配:-

有效地对于编译单元是全局的“静态”。 当主程序启动时,将分配一个合适的存储块,并且在这块空缺中为每个“静态”分配一个地址。 在主程序终止之前一直使用它。

“堆”是由“ malloc”管理的存储区域的集合,在底层操作系统的帮助下。 大多数(但不是全部!)“新”对象都以这种方式分配内存。

然后,“自动”存储(默认设置)将使用堆栈。 同样,这是主程序启动时分配的相当大的连续存储区域。 “ main”使用的所有自动变量都将分配给堆栈的开头,并且堆栈指针递增,以指向main的最后一个变量结束后的单词。 当调用第一个函数时,它将从当前堆栈指针开始分配其自动变量,并将stck指针设置为最后一个变量结束后的单词,如果调用其他函数,则会重复该过程。 当函数结束时,堆栈指针将重置为调用该函数时具有的任何值。

这样,存储就可以不断重用,而无需任何malloc或释放,并且它易于实现递归函数,因为每个调用都会在堆栈中获得自己的一部分(直到堆栈用完!)。

是的,只要函数通过执行“ return XXXX”返回,则将删除相关函数的堆栈框架。 在此过程中销毁了本地自动存储持续时间对象。 它还可能涉及对某些CPU寄存器的操作(例如ESP,Intel的EBP),并且是特定于实现的行为。 返回条件是在条件中还是在要返回的值上执行并不重要

编辑2:

在下面的代码中,销毁了本地对象“ s”(具有自动存储时间)。 本地对象“ p”和“ x”也被破坏,但是直到完成显式删除(使用delete)后,“ p”所指向的内存才被新删除。 无论函数“ f”是何时通过“ return true”或“ return false”返回,这一切都将发生

struct S{};
bool f(int x){
   S s;
   S *p = new S;
   if(x == 2) return true;
   else return false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM