3 回答

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

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

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