_stdcall调用
以前看windows編程時一直有個 _stdcall 函數調用約定 一直不是很理解,只能硬記。 現在終于在《程序是怎樣跑起來的》這本書書中找到了答案。
1. _stdcall 是standard call (標準調用) 的略稱
? ?Windows提供的DLL文件內的函數基本上都是_stdcall調用方式。但用C語言編寫的程序內的函數,默認設置都不是 _stdcall. C語言特有的調用方式成為C調用,之所以默認不使用 _stdcall, 是因為C語言所對應的函數傳入的參數是可變的,只有函數調用方才能知道到底有多少個參數,這種情況下,棧的清理作業便無法進行(關于這點會在下面詳細說明)。不過,如果在C語言中函數的參數固定的話,指定 _stdcall 是沒有問題的。
2. 通過 _stdcall 調用來減小程序文件的大小
? ?C語言中,在調用函數后,需要執行棧清理處理指令。指的是把不需要的數據從接收和傳遞函數的參數時使用的內存上的棧區域清理出去。該命令是在程序編譯時由編譯器自動附加到程序中的,編譯器默認將該處理附在函數調用方。在同一個程序中,同樣的函數可能會被反復調用多次,而如果是同樣的函數,棧清理處理的內容也是一樣。由于該處理是在調用函數一方,因此就會導致同一處理被反復進行,造成內存浪費。、
? ?棧清理處理,比起在函數調用方進行,在反復被調用的函數一方進行時,程序整體要小一些。這時所使用的就是 _stdcall。在函數前加上 _stdcall 就可以把棧清理處理變為在被調用函數一方進行。下面是圖示:
總結
以上是生活随笔為你收集整理的_stdcall调用的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: C++知识回顾之__stdcall、__
 - 下一篇: __stdcall 和 __cdecl