為什麼 Windows API 使用 stdcall 呼叫約定?

時間 2021-06-01 01:41:15

1樓:孫志超

僅有的兩個回答都是非常正確的,不過我補充一點,Windows API使用stdcall是個歷史遺留的產物,要知道早期,NT3.1那時候的記憶體是非常寶貴的,所以使用stdcall可以顯著節約記憶體。(沒記錯的話張銀奎老師翻譯的《觀止:

微軟建立NT和未來的奪命狂奔》提到過這個問題)

2樓:

你是想問為啥Windows C++中全是stdcall或WINAPI,而不是cdecl的calling convention吧?原因簡單直接,生成執行碼的大小。

WINAPI就是stdcall的乙個巨集定義,其實是一回事。stdcall約定是被呼叫者清棧,返回時指令帶乙個退棧引數就可以了,被呼叫者自己一句ret n就完事了。

cdecl約定是呼叫者清棧,就是每乙個呼叫者在函式呼叫完成後,要每乙個呼叫者自己去拉esp把棧狀況改回來。

stdcall的缺點就是無法支援可變數量的引數,因為被呼叫者必須確定引數數量才能自己清棧。我印象中老Win32 API只有乙個API支援變長引數,所以只有她是cdel而不是stdcall,來自user32的wsprintf。

為什麼要使用 Evernote?

悶騷的劉大哥 1.記錄 梳理想法很方便,討厭新建word寫文件2.自動同步,這讓有網路的地方就有工作備份3.標籤的組織方式,讓人很容易養成總結 整理知識的好習慣現在工作中,可以不開QQ,不能不開evernote,因為有些梳理 想法 計畫,它都幫我記著。 我說說我的使用後的體驗 1.使用方法 網頁編輯...

transformer 為什麼使用 layer normalization,而不是其他的歸一化方法?

Leo 在 佳雨 同學回答的基礎上,加一些個人直觀的理解。Normalization目的就是讓分布穩定下來 降低各維度資料的方差 使用不同的norm方式即選擇損失的資訊維度不同 CV使用BN是認為不同卷積核feature map channel維 之間的差異性很重要,LN會損失channel的差異性...

redis為什麼不使用非同步io而使用多路io復用?

老虎說 非同步io在Linux系統目前為止還不成熟,多路復用是同步io和非同步io之間的一種折衷方案。並且多路復用模型已經能很大程度上解決併發程式設計問題了 iovec 非同步IO的要求是,從核心複製資料到使用者態這個過程是非阻塞的。使用者提前設定好的資料接收緩衝區,當IO就緒,作業系統會自己執行I...