調用約定__cdecl和__stdcall

首先,__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.

略。

相關文章
相關標籤/搜索