什麼是棧分配?
棧分配是一種執行時儲存管理技術。啟用記錄分別在啟用開始和結束時被壓入和彈出。
每個過程呼叫中的區域性變數的儲存都包含在該呼叫的啟用記錄中。因此,區域性變數在每次啟用中都繫結到新的儲存空間,因為在進行呼叫時會將新的啟用記錄壓入棧中。
可以在執行時確定變數的大小,因此區域性變數可以在不同的啟用過程中具有不同的儲存位置和不同的值。假設已註冊的頂部標記棧的頂部。在執行時,可以透過分別將頂部遞增和遞減記錄的大小來分配和釋放啟用記錄。
如果過程 q 的啟用記錄大小為 a,則在執行 q 的目的碼之前,頂部將遞增 a。當控制權從 q 返回時,棧的頂部將遞減 a。
UNIX 平臺上 C 程式的記憶體組織如下:
在 C 中,資料可以是全域性的,這意味著它被分配到靜態儲存區並且可供任何過程使用,或者它是區域性的,這意味著只能由宣告它的過程訪問。一個程式由一個全域性資料宣告列表和宣告它的過程組成。
有兩個指標,一個是指標棧(SP),它始終指向當前啟用過程的啟用記錄中的特定位置。第二個指標稱為頂部,它始終指向棧的頂部,即啟用記錄的頂部。
臨時變數用於表示式求值,並分配在啟用記錄之上。啟用記錄是一種在呼叫過程/函式時啟用/建立的資料結構,它包含以下有關函式的資訊。
“C”語言中的啟用記錄包括
- 實際引數
- 引數數量
- 返回地址
- 返回值
- 舊棧指標 (SP)
- 函式或過程中的區域性資料
舊 SP儲存呼叫此過程並導致生成此啟用記錄的過程的啟用記錄的棧指標值,即它是指向呼叫方的啟用記錄的指標。
可選訪問連結 - 它定義了儲存在另一個啟用記錄中的非區域性資料。
可選控制連結 - 它指向呼叫方的啟用記錄。
實際引數 - 呼叫過程使用它向被呼叫過程提供引數。
返回值 - 被呼叫過程使用此欄位將值返回給呼叫過程。每個欄位的大小在呼叫過程時確定。幾乎所有欄位的大小都可以在編譯時確定。
廣告