作者wowtiger (小虎)
看板C_and_CPP
標題Re: [問題] __stdcall __cdecl
時間Mon Feb 22 22:47:36 2010
※ 引述《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)
推 VictorTom:真強, 先推一下:) 02/22 23:40
推 littleshan:呼叫 bar() 的時候可以不用再把 a 和 b 塞一次 02/23 10:57
→ littleshan:所以是 sub esp, 12 02/23 10:57
→ littleshan: mov [esp], a 02/23 10:58
→ littleshan: mov [esp+4], b 02/23 10:58
→ littleshan: mov [esp+8], c 02/23 10:58
→ littleshan: call foo 02/23 10:58
→ littleshan: call bar 02/23 10:58
推 VictorTom:疑?? 不好意思請問一下l大, 不再塞一次的話, 那萬一 02/23 11:14
→ VictorTom:func內有對a, b兩個傳入參數modify過的話怎麼辦@_@" 02/23 11:14
推 littleshan:噢 這邊是我錯了 02/23 12:19
→ littleshan:我以為 C convention 會規定不能修改 parameter 02/23 12:19
→ littleshan:不過看來是沒這項規定 02/23 12:19