簡體   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