棧的作用和功能這裡就不再敘述了。
先看乙個最簡單的函式呼叫例子:
[cpp]view plain
copy
#include "stdafx.h"
int call(int _a,int _b);
void _tmain()
int call(int _a,int _b)
main函式中呼叫call函式,並傳入2個引數a,b。呼叫結束後返回賦值給c。這裡可以分為兩部分分析:
當呼叫乙個函式時,系統發生進行如下動作,記憶體模型如下圖:
(1)開闢該呼叫函式的棧空間。
(2)將當前的執行狀態壓棧
(3)將返回位址壓棧
(4)在棧內為傳參分配空間
(5)在棧內為函式內區域性變數分配空間,執行被呼叫函式
當被呼叫函式結束後,進行返回時,系統進行的動作剛好與函式呼叫時相反,記憶體模型如下圖:
(1)釋放棧內區域性變數空間
(2)釋放棧內傳參空間
(3)退棧,得到返回位址,程式跳轉調用處等待
(4)退棧,得到呼叫前執行狀態,恢復呼叫前執行狀態
(5)釋放該呼叫函式棧空間
函式呼叫時引數的傳遞過程中還有兩個需要注意的問題:
1.多個引數的入棧順序?
2.誰來清理呼叫堆疊?
在高階語言中,是通過函式呼叫約定來說明這兩個問題的。c++採用的函式呼叫約定就是__stdcall。__stdcall包含兩個意思,第一是按照c風格傳遞引數即引數從右自左壓入堆疊,函式內部正好從左自右讀出引數,第二是函式執行清除堆疊,即呼叫函式是堆疊中壓入引數時占用了位置,這些位置將由呼叫函式負責清空。
C 函式呼叫機制
區域性變數占用的記憶體是在程式執行過程中 動態 地建立和釋放的。這種 動態 是通過棧由系統自動管理進行的。當任何乙個函式呼叫發生時,系統都要作以下工作 1 建立棧空間 3 為被調函式中的區域性變數分配空間,完成引數傳遞 4 執行被調函式函式體 5 釋放被調函式中區域性變數占用的棧空間 7 繼續主調函...
C 之 main函式的呼叫與被呼叫
main函式能呼叫自身嗎?其他函式能呼叫main函式麼?下面先看一段有意思的程式,乙個簡潔有趣的列印菱形的程式。cpp view plain copy intline 1 intmain 效果圖如下 首先說一下 s 的用法,即 是用乙個int引數來代替,比如 printf s n 5,def 就相當...
C 靜態構造函式呼叫機制
若乙個類中有靜態建構函式,在首次例項化該類或任何的靜態成員被引用時,net自動呼叫靜態建構函式來初始化該類。注意是 首次 即繼續例項化該類時,不會呼叫該類的靜態建構函式。1 例項化時呼叫靜態建構函式 靜態建構函式 main主函式在類staticconstructortest之中 1.程式被載入時,首...