程式棧 棧幀

2021-09-19 23:45:55 字數 1310 閱讀 6346

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分:

棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數名,區域性變數的名等。其操作方式類似於資料結構中的棧。

堆區(heap)— 由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

靜態區(static)—全域性變數和區域性靜態變數的儲存是放在一塊的。程式結束後由系統釋放。

文字常量區—常量字串就是放在這裡的,程式結束後由系統釋放 。

程式**區— 存放函式體的二進位制**。

堆和棧的區別:

過程呼叫

個過程的呼叫包括將資料(以過程引數和返回值的形式)和控制從**的一部分傳遞到另外一部分。

必須在進入時為過程的區域性變數分配空間,並在退出時釋放這些空間。

過程呼叫的實現,依靠的是乙個由系統分配的乙個棧空間:

機器用棧來傳遞過程引數,儲存返回資訊,儲存暫存器用於以後恢復,以及本地儲存

為單個過程分配的那部分棧稱為「棧幀「。

程式棧通常和堆共享,也就是說,它們共享一塊記憶體區域。程式棧通常佔據這塊區域的下部,而堆用的是上部,也就是棧下堆上。

注意:如果程式遞迴層數過多,可能會導致記憶體空間被耗盡,出現棧溢位的情況。這時就可能出現程式非正常退出(崩潰╮(╯▽╰)╭)。

程式棧的結構:

程式棧存放幀(stack frame),棧幀有時候也稱為活躍記錄(activation record)或者是活躍幀(activation frame),棧幀存放函式引數和區域性變數,管理動態記憶體。

系統在建立棧幀時,將引數以跟宣告時相反的順序推到幀上,最後推入區域性變數。

乙個過程呼叫結束後(返回函式呼叫結果的時候),對應的幀就應該被從棧中退出:

程式棧會把呼叫者的幀的幀底指標的值取出來,然後把呼叫者的幀的幀底指標的值賦給ebp,再把返回位址彈出來,讓程式跳到返回位址所指的地方繼續執行。esp在退回去的過程中,退到臨時變數時,會依次呼叫臨時變數的析構函式(如果有的話)(這就是出了函式作用域臨時變數就不再有效的原因),接著程式棧就又回到了呼叫這個幀之前的狀態。

然後它會繼續完成呼叫者的呼叫過程。

棧操作與棧幀

結構化程式的乙個最基本的單元就是 函式 或者叫 過程 在彙編這一層自然也相應的有支援這些概念的指令操作,如棧操作和棧幀的概念。1 定址方式 我們已經知道在運算元表示中有一種是用來指示記憶體位址的內容的,在gnu assembly中指示記憶體位址有多種方式,這些方式被統稱 定址方式 通用的定址格式為 ...

Objective C指標 棧幀 棧

1 objective c的指標是用來只是物件的,例如 nsstring somestring the string 這種語法基本上是照搬c語言的,宣告了乙個名為somestring的變數,其型別為nsstring 也就是說此變數為指向nsstring的指標。所有objective c的物件都必須這...

PowerPC棧幀理解

因為實驗室專案的原因,才開始接觸powerpc,錯誤的地方還望看到的各位指正。上面就是ibm的手冊上面畫的棧幀,他的文字描述也符合這個示意圖,理解起來就是棧頂存放的是上乙個棧的棧頂的位址。r1暫存器 一般作為預設的堆疊指標 存放自身的棧頂。因為沒有push和pop指令,所以是通過stwu和lwzu來...