還是我發在csdn上的。。。。
一邊牆(堆疊)是大家共用的,我把我的幾個命令分別寫在幾張紙條上,一張黏在一張上貼在牆上,並呼叫服務員(函式)
這時的紙條棧是
-----
我的命令a
我的命令b
-----
由於我與服務員約定了命令的個數(比如2個命令/引數),和最後誰來清理紙條(stdcall/cdecl),服務員檢視了牆上最外層的兩張,按照我給的命令,服務員也準備要呼叫後勤人員。他把他的命令寫在紙條上(比如有3條命令),貼在了我的紙條棧上,呼叫後勤人員
這時的紙條棧是
-----
服務員的命令1
服務員的命令2
服務員的命令3
我的命令a
我的命令b
-----
後勤人員按照與服務員的約定(引數有3個),檢視頂上的三條命令(服務員的命令1、2、3),完成他的工作,由於後勤人員與服務員約定了後勤人員來把紙條清理,於是後勤人員清理了給他的3張紙條,然後告訴服務員ok了
這時的紙條棧是
-----
我的命令a
我的命令b
-----
是不是很神奇呢?被後勤叫回來的服務員回到了公共牆,牆上最外面的兩條命令依舊是我給他的命令(雖然已經呼叫了其他人,只要回到某人時,命令棧的頂部永遠是給這個人的命令,這就是棧用在這裡的好處)他幹完了工作,按照約定,自行清理我給他的兩條命令,呼叫我
這時的紙條棧是
-----
-----
我回到命令牆,牆和我呼叫服務員之前沒有任何區別了,紙條棧空了
如果服務員呼叫了兩個函式怎麼辦?
服務員分別呼叫後勤a和b
開始呼叫前紙條棧是
-----
我的命令a
我的命令b
-----
服務員呼叫後勤a
-----
服務員的命令1
服務員的命令2
服務員的命令3
我的命令a
我的命令b
-----
後勤a返回到服務員
-----
我的命令a
我的命令b
-----
這時服務員不能清除我給他的命令,因為還要呼叫後勤b才能返回
服務員呼叫後勤b
-----
服務員的命令4
服務員的命令5
我的命令a
我的命令b
-----
後勤b返回到服務員
-----
我的命令a
我的命令b
-----
服務員完成它所有的工作後,才能清理堆疊
-----
-----
2013-04-26
stdcall 與 cdecl 的區別
stdcall 與 cdecl 的區別 幾乎我們寫的每乙個windows api函式都是 stdcall型別的,首先,需要了解兩者之間的區別 windows的函式呼叫時需要用到棧 stack,一種先入後出的儲存結構 當函式呼叫完成後,棧需要清除,這裡就是問題的關鍵,如何清除?如果我們的函式使用了 c...
stdcall 與 cdecl 的區別
幾乎我們寫的每乙個windows api函式都是 stdcall型別的,首先,需要了解兩者之間的區別 windows的函式呼叫時需要用到棧 stack,一種先入後出的儲存結構 當函式呼叫完成後,棧需要清除,這裡就是問題的關鍵,如何清除?如果我們的函式使用了 cdecl,那麼棧的清除工作是由呼叫者,用...
cdecl和 stdcall的區別
1 cdecl和 stdcall的區別 1 cdecl呼叫按照從右往左的順序將引數入站,由呼叫者把引數彈出棧 stdcall呼叫按照從右往左的順序將引數入站 由被呼叫者把引數彈出棧 2 stdcall 和 cdecl對函式名最終生成符號的方式不同 stdcall呼叫約定在輸出函式名前加下劃線,後面為...