Re: [問題] __stdcall __cdecl

看板C_and_CPP作者 (小虎)時間14年前 (2010/02/22 22:47), 編輯推噓4(409)
留言13則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《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
呼叫 bar() 的時候可以不用再把 a 和 b 塞一次
02/23 10:57, 2F

02/23 10:57, , 3F
所以是 sub esp, 12
02/23 10:57, 3F

02/23 10:58, , 4F
mov [esp], a
02/23 10:58, 4F

02/23 10:58, , 5F
mov [esp+4], b
02/23 10:58, 5F

02/23 10:58, , 6F
mov [esp+8], c
02/23 10:58, 6F

02/23 10:58, , 7F
call foo
02/23 10:58, 7F

02/23 10:58, , 8F
call bar
02/23 10:58, 8F

02/23 11:14, , 9F
疑?? 不好意思請問一下l大, 不再塞一次的話, 那萬一
02/23 11:14, 9F

02/23 11:14, , 10F
func內有對a, b兩個傳入參數modify過的話怎麼辦@_@"
02/23 11:14, 10F

02/23 12:19, , 11F
噢 這邊是我錯了
02/23 12:19, 11F

02/23 12:19, , 12F
我以為 C convention 會規定不能修改 parameter
02/23 12:19, 12F

02/23 12:19, , 13F
不過看來是沒這項規定
02/23 12:19, 13F
文章代碼(AID): #1BWfaBFu (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BWfaBFu (C_and_CPP)