函式呼叫時發生了什麼?

2021-10-10 08:21:50 字數 574 閱讀 5708

我們以如下**示例,描述函式呼叫過程中,棧的操作過程:

voidf(

)intg(

int x)

每次函式呼叫,作業系統都會在棧中建立乙個棧幀(stack frame)。正在執行的函式引數、區域性變數、申請的記憶體位址等都在當前棧幀中,也就是堆疊的頂部棧幀中。如下圖所示:

當 f 函式執行的時候,f 函式就在棧頂,棧幀中儲存著 f 函式的區域性變數,輸入引數等等。當 f 函式呼叫 g 函式,當前執行函式就變成 g 函式,作業系統會為 g 函式建立乙個棧幀並放置在棧頂。當函式 g() 呼叫結束,程式返回 f 函式,g 函式對應的棧幀出棧,頂部棧幀變又為 f 函式,繼續執行 f 函式的**,也就是說,真正執行的函式永遠都在棧頂。而且因為棧幀是隔離的,所以不同函式可以定義相同的變數而不會發生混亂。

如果頻繁地進行函式呼叫,就會頻繁地入棧出棧,這種開銷並不可以忽略不計,在c++中合理地使用內聯函式,可以避免這種函式呼叫的開銷。

函式呼叫時發生了什麼

我們下面就來 一下高階語言中函式的呼叫和遞迴等性質是怎樣通過系統棧巧妙實現的。請看如下 int func b int arg b1,int arg b2 int func a int arg a1,int arg a2 int main int argc,char argv,char envp 這段...

函式呼叫時發生了什麼

第一步 函式呼叫 1 對實參表從右向左,一次計算出實參的值,並且將值壓棧。2 將函式呼叫語句 儲存到在棧中,以便函式呼叫完成後返回。壓棧 3 跳轉到函式體處。第二步 函式體執行 4 如果函式體中定義了變數,將變數壓棧 5 將每乙個形參以棧中對應的 實參值取代,執行函式體的功能體。6 將函式體中的變數...

函式呼叫的時候棧發生了什麼?

問題分析 本文分析的問題是函式的棧呼叫機理。先說結論 所謂的暫存器入棧 實際上是指的一組暫存器入棧。因為在新呼叫的函式中,這些暫存器仍然會被用到,為了退出呼叫函式後能恢復狀態,凡是有可能被修改的暫存器都要入棧。出棧順序和入棧順序相反。這個過程由編譯器維護。在現在普遍應用的單指令流,單資料流計算機上,...