簡要說明堆??蚣艿母拍?/h1>
3 回答

TA貢獻1934條經驗 獲得超2個贊
堆棧幀是被推入堆棧的數據幀。在調用堆棧的情況下,堆棧幀代表函數調用及其參數數據。
如果我沒記錯的話,函數的返回地址首先被壓入堆棧,然后是局部變量的參數和空間。盡管這可能取決于體系結構,但它們共同構成了“框架”。處理器知道每個幀中有多少字節,并在將幀壓入并彈出堆棧時相應地移動堆棧指針。
編輯:
更高級別的調用堆棧和處理器的調用堆棧之間存在很大的差異。
當我們談論處理器的調用堆棧時,我們談論的是在匯編或機器代碼中以字節/字級別使用地址和值。在談論高級語言時,有“調用棧”,但是它們是運行時環境管理的調試/運行時工具,因此您可以(在較高級別)記錄程序出了什么問題。在此級別上,通常知道行號,方法和類名之類的東西。到處理器獲得代碼時,它完全沒有這些東西的概念。

TA貢獻1865條經驗 獲得超7個贊
如果您非常了解堆棧,那么您將了解內存在程序中的工作方式,如果您了解內存在程序中的工作方式,則將了解函數在程序中的存儲方式,如果您了解函數在程序中的存儲方式,則將了解遞歸函數的工作方式以及是否您了解遞歸函數的工作原理,您將了解編譯器的工作原理,如果您了解編譯器的工作原理,那么您的想法將像編譯器一樣工作,并且您將很容易調試任何程序
讓我解釋一下堆棧是如何工作的:
首先,您必須知道函數如何存儲在堆棧中:
堆存儲動態內存分配值。堆棧存儲自動分配和刪除值。
在此處輸入圖片說明
讓我們用例子來理解:
def hello(x):
if x==1:
return "op"
else:
u=1
e=12
s=hello(x-1)
e+=1
print(s)
print(x)
u+=1
return e
hello(4)
現在了解該程序的各個部分:
現在讓我們看看什么是堆棧以及什么是堆棧部分:
堆棧分配:
請記住一件事,無論任何函數加載了他的所有本地變量,或者任何將立即從堆棧返回的東西都將返回其堆棧框架,該函數都會“返回”。這意味著當任何遞歸函數獲得基本條件并且我們在基本條件之后放置return時,這樣基本條件將不會等待加載位于程序“ else”部分中的局部變量,它將立即從堆棧中返回當前幀,現在如果返回一幀返回下一幀在激活記錄中。實際看到這一點:
塊的解除分配:
因此,現在無論何時找到返回語句的函數,它都會從堆棧中刪除當前幀。
從堆棧返回時,值將以它們在堆棧中分配的順序相反的順序返回。

TA貢獻1844條經驗 獲得超8個贊
快速總結。也許有人有更好的解釋。
調用堆棧由1個或多個堆棧幀組成。每個堆棧幀對應于對尚未返回的終止函數或過程的調用。
要使用堆棧框架,線程保留兩個指針,一個稱為堆棧指針(SP),另一個稱為幀指針(FP)。SP始終指向堆棧的“頂部”,而FP始終指向框架的“頂部”。此外,該線程還維護一個程序計數器(PC),該計數器指向要執行的下一條指令。
以下內容存儲在堆棧中:局部變量和臨時變量,當前指令的實際參數(過程,函數等)
關于清理堆棧有不同的調用約定。
- 3 回答
- 0 關注
- 741 瀏覽
添加回答
舉報