stdcall的故事版解釋

2021-07-03 06:32:48 字數 1364 閱讀 5205



還是我發在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呼叫約定在輸出函式名前加下劃線,後面為...