首先,__cdecl,c declaration,C風格聲明。或者 c default calling(筆者瞎編的)。(那麼問題來了,爲何PASCAL風格被稱爲std?)c++
調用約定的內容包括三點:參數出入棧順序,彈棧工做由誰作,以及產生函數名的方式(renaming?)程序員
1.windows
在參數入棧順序上,__cdecl和__stdcall沒有區別都是從右往左;函數
2.io
__cdecl既然是c/c++默認,讓咱們回憶下下stl中的printf這樣的變長參數函數,只有調用者才知道實參的狀況,所以由調用者去負責恢復棧,大概是比較恰當的。二進制
那麼結論來了,__cdecl,指定了由調用者負責彈棧。程序
接着往下……方法
調用者負責彈棧,意味着,在最終的可執行代碼中,全部調用被指定爲__cdecl的方法的地方都會相對__stdcall多生成一段清理棧的代碼。call
換句話說,若是windows API做爲一套已存在的系統/二進制碼/或者其餘什麼,當它在調用應用程序提供的函數的時候,已經沒辦法知道程序員提供的方法(CALLBACK/WINAPI)要如何清理棧,stl
更不可能有機會將處理棧的代碼新增到這套已經存在的「系統/二進制碼/或者其餘什麼」中,所以必須由函數提供方自行處理棧。
這也就是CALLBACK/WINAPI爲何是__stdcall的緣由。
3.
略。