什麼是簡單的棧分配方案的實現


棧分配方案是最簡單的執行時儲存管理技術。儲存在棧中從一端開始順序分配。儲存的釋放順序應該與分配順序相反,以便釋放的儲存塊始終位於棧頂。

程式由資料和過程組成。執行每個過程時,會佔用一定量的記憶體,其中包含有關過程的資訊,即其實際引數、引數數量、返回地址、返回值和區域性資料等。記憶體的這一部分是該過程的**活動記錄**。

活動記錄

活動記錄是一種資料結構,在呼叫過程/函式時被啟用/建立,它包含以下關於函式的資訊。

C語言中的活動記錄包含:

  • 實際引數
  • 引數數量
  • 返回地址
  • 返回值
  • 舊棧指標 (SP)
  • 函式或過程中的區域性資料


這裡,**舊SP**儲存呼叫此過程並導致生成此活動記錄的過程的活動記錄的棧指標值,即它指向呼叫者的活動記錄。

棧分配方案需要兩個指標:

  • **top**——它指向棧頂。top 指向最頂層活動記錄的頂部。在圖中,top 指標將指向 C 活動記錄的頂部。
  • **棧指標 (SP)**——它指向當前活動過程的活動記錄。


**實際引數**——呼叫過程使用它向被呼叫過程提供引數。

**返回值**——被呼叫過程使用此欄位將值返回給呼叫過程。上述每個欄位的大小在呼叫過程時確定。幾乎所有欄位的大小都可以在編譯時確定。

過程呼叫的棧分配

可以分析在執行時呼叫過程和從過程返回值時如何分配記憶體。

考慮一個過程 P(x1, x2, x3 … … xn)。此過程呼叫的三地址程式碼語句將是

param x1

param x2

…………….

param xn

call P, n

其中 𝐜𝐚𝐥𝐥 𝐏, 𝐧 → 呼叫具有 n 個引數的過程 P。

𝐏𝐚𝐫𝐚𝐦 𝐱 → 指的是傳遞實際引數 x。

執行與過程相關的所有以下語句將在執行時執行棧分配。

  • 𝐏𝐚𝐫𝐚𝐦 𝐱 ∶ 傳遞實際引數 x。
  • 𝐜𝐚𝐥𝐥 𝐏, 𝐧− 呼叫具有 n 個引數的過程 P。
  • 𝐩𝐫𝐨𝐜𝐛𝐞𝐠𝐢𝐧− 過程的第一條語句
  • 𝐫𝐞𝐭𝐮𝐫𝐧(𝐯𝐚𝐥𝐮𝐞)− 返回值時。
  • 𝐞𝐧𝐝− 過程的最後一條語句。


更新於:2021年11月8日

4K+ 瀏覽量

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告