C語言 棧幀 總結

2021-09-07 04:05:47 字數 761 閱讀 2998

棧幀也叫過程活動記錄,是編譯器用來實現過程/函式呼叫的一種資料結構。

從邏輯上講,棧幀就是乙個函式執行的環境:函式引數、函式的區域性變數、函式執行完後返回到**等等。

大概翻了翻,網上對於「棧幀」這塊的知識總結也都大同小異,根據程式除錯的彙編**一步步分析,看的人腦袋疼。所以在這裡我簡明扼要。

在之前的「記憶體管理」中,我們分享了c語言的記憶體分布,認識了「堆疊」。

堆疊中一般儲存區域性變數,位址空間向下擴充套件。如上圖,我們在呼叫main()函式時,就會在堆疊上開闢出相應的「棧幀」;每個函式都有自己的「棧幀」結構,儲存自己的返回值,引數等等資訊。當函式呼叫的時候,就會通過機器暫存器的相關操作去對應位置call相應的函式。被呼叫的函式返回之後,系統就會釋放相應的棧幀結構。具體過程大家可以按照想象,或是再查詢一些資料深一些研究。

1 形參例項化的臨時變數存在於呼叫函式和被呼叫函式的兩者棧幀結構之間。

2 函式傳參時從右到左。

3 臨時變數為什麼具有臨時性:函式呼叫形成棧幀,返回時銷毀棧幀,而函式定義的臨時變數存在於自己的棧幀裡,所以臨時變數的生命週期伴隨著自己函式的棧幀結構。

4 任何函式都有自己的棧幀結構,且是自己的生成的。

5 常規情況下,函式的返回值會以暫存器的形式供我們返回。

6.「棧幀底部」和「棧底」是不同的概念;esp(暫存器指標)所指的棧幀頂部和系統棧的頂部是同乙個位置。

C語言函式棧幀解析

目錄 eax,ebx,ecx ebp 存放了指向函式棧幀棧底的位址 esp 存放了指向函式棧幀棧頂的位址 函式被呼叫時,系統會在棧區為該函式開闢一塊棧空間,這個棧空間就是該函式的函式棧幀。以main函式的呼叫為例 棧幀也叫過程活動記錄,是編譯器用來實現函式呼叫過程的一種資料結構。從邏輯上講,棧幀為乙...

C語言 函式呼叫過程(棧幀)

首先舉個栗子 include int add int x,int y int main 在這個程式裡,函式被呼叫才會發揮函式的功能,而函式的呼叫其實是乙個過程,在這個過程計算機要為函式開闢棧空間,用於本次函式臨時變數的儲存和現場保護,這塊空間稱為函式的棧幀。現場保護的作用是為了在呼叫完另乙個函式,返...

C語言函式呼叫及棧幀結構

原文 一 位址空間與物理記憶體 1 位址空間與物理記憶體是兩個完全不同的概念,真正的 及資料都存在物理記憶體中。物理儲存器是指實際存在的具體儲存器晶元,cpu在操縱物理儲存器的時候都把他們當做記憶體來對待,把他們看成由若干個儲存單元組成的邏輯儲存器,這個邏輯儲存器就是我們所說的位址空間。位址空間大小...