C語言-第35課 - 函數調用行為
阿新 • • 發佈:2018-10-22
align cdecl 維護 pan 機制 開發 協議 當前 編譯
第35課 - 函數調用行為
- 活動記錄
活動記錄是函數調用時用於記錄一系列相關信息的記錄,包括:
l 臨時變量域:用來存放臨時變量的值,如k++的中間結果(生成臨時變量,將k的值賦值給臨時變量,k=k+1)--temp。
l 局部變量域:用來存放函數本次執行中的局部變量。
l 機械狀態域:用來保存調用函數之前有關機器狀態的信息,包括各種寄存器的當前值和返回值等。
l 實參數域:用於存放函數的實參信息。
- 參數入棧
既然函數參數的計算次序是依賴編譯器實現的,那麽函數參數的入棧次序是如何確定的呢?由調用約定來描述。我們自己來約定。
- 調用約定
(1)當一個函數被調用時,參數會傳遞給被調用的函數,而返回值會被返回給調用的函數。函數的調用約定就是描述參數是怎麽傳遞到棧空間的,以及棧空間由誰來維護。
(2)參數傳遞順序
從右到左一次入棧:_stdcall, _cdecl, _thiscall
從左到右依次入棧:_pascal, _fastcall
l pf為正。
(3)調用堆棧清理
調用者清除棧。
被調用函數返回後清除棧。
註:在調用動態函數庫的時候,我們就得規定調用約定,使雙方一致,否則在調用的過程中會出錯。調用約定的用法,就是在指定的函數前面加上對應的符號就好,如:_pascal f()
小結:
(1) 函數調用是C語言的核心機制。
(2) 活動記錄中保存了函數調用以及返回所需要的一切信息。
(3) 調用約定是調用者和被調用者之間的調用協議,常用語不同開發者編寫的庫函數之間。
C語言-第35課 - 函數調用行為