Re: [問題] __stdcall __cdecl
※ 引述《WPC001 (突然覺得自己是孤獨的...)》之銘言:
: ※ 引述《Smurf (哈里歐)》之銘言:
: : 我有兩個問題:
: : 1. 是因為_beginthreadex參數有__stdcall 所以callee要加call convention
: : 還是因為是呼叫OS的API所以才要加call convention呢?
: : 2. 我查資料後 文件是說__cdecl是C和C++程式的預設呼叫方式
: : 那一般我們在宣告函式的時候 都不寫call convention是因為他預設是__cdecl呼叫
: : 還是其他原因呢??
: 1. 如果對方有需要stdcall, 那請用stdcall
: 2. 沒寫calling convention的話, 以編譯器設定為主,
: 編譯器可以指定"預設"的convention (如果也沒指定, 通常是cdecl)
: stdcall --> Pascal call, 由"被"呼叫的函數清除堆疊
: cdecl --> 由呼叫別人的那部分程式碼來清除堆疊
: fastcall --> C/C++自己搞的慣例, 可以使用EAX/EDX/ECX儲存參數(依序)
: (Delphi預設為fastcall)
MSVC fastcall ECX EDX
Borland fastcall EAX ECX EDX
Watcom fastcall EAX EBX ECX EDX
: 不過如果大家都不寫組合語言的話,
: 只要大概知道速度上大約是fastcall > cdecl > stdcall
: (cdecl比stdcall快的原因是cdecl有助於整體的最佳化...,
: 通常是用add esp,xx就清完堆疊了)
我記得是
foo (a, b)
bar (a, b ,c)
的時候可以這樣子作
sub esp, 12
mov [esp], a
mov [esp+4], b
call foo
mov [esp], a
mov [esp+4], b
mov [esp+8], c
call bar
在連續呼叫函式上會有所幫助
相對的 stdcall 在 caller 要額外 add/sub esp
但其實這些只適合在 AMD 或 Intel 的 Core Duo 以前的最佳化
Core 2 Duo 新增了 Stack pointer tracker
用傳統的 push pop 反而會比上面的快
因此 stdcall 也比 cdecl 更快 (因為少了 add/sub esp 動作)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 115.43.38.106
※ 編輯: wowtiger 來自: 115.43.38.106 (02/22 22:48)
推
02/22 23:40, , 1F
02/22 23:40, 1F
推
02/23 10:57, , 2F
02/23 10:57, 2F
→
02/23 10:57, , 3F
02/23 10:57, 3F
→
02/23 10:58, , 4F
02/23 10:58, 4F
→
02/23 10:58, , 5F
02/23 10:58, 5F
→
02/23 10:58, , 6F
02/23 10:58, 6F
→
02/23 10:58, , 7F
02/23 10:58, 7F
→
02/23 10:58, , 8F
02/23 10:58, 8F
推
02/23 11:14, , 9F
02/23 11:14, 9F
→
02/23 11:14, , 10F
02/23 11:14, 10F
推
02/23 12:19, , 11F
02/23 12:19, 11F
→
02/23 12:19, , 12F
02/23 12:19, 12F
→
02/23 12:19, , 13F
02/23 12:19, 13F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):