[問題] __fastcall / inline

看板C_and_CPP (C/C++)作者 (藍影)時間15年前 (2011/04/29 16:45), 編輯推噓2(2011)
留言13則, 2人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc2008 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) http://www.codeproject.com/KB/cpp/Sqrt_Prec_VS_Speed.aspx for sqrt14 (__asm) 問題(Question): 我於 codeproject 找了一份 sqrt 14 種算法 (其實是要加速) 在 vc2008 下, .cpp 是可以過, 若為 .c 會出現錯誤結果, Q1 : 另其中 __declspec (naked) __fastcall 這二個是幹嘛的我看了 document 還是看得很花, 把這二個關鍵字拿掉 .cpp 還是可以正常執行, 看起來似乎不影響結果。 錯誤結果(Wrong Output): 副檔名 .cpp 正確無誤 副檔名 .c 出現以下錯誤結果 error C2054: 在 'inline' 之後必須有 '(' error C2085: 'sqrt14' : 不在型式參數清單中 error C2143: 語法錯誤 : 遺漏 ';' (在 '{' 之前) warning C4013: 'sqrt14' 未定義; 假設 extern 傳回整數 程式碼(Code):(請善用置底文網頁, 記得排版) double inline __declspec (naked) __fastcall sqrt14(double n) { _asm fld qword ptr [esp+4] _asm fsqrt _asm ret 8 } int main() { sqrt14(2.0); return 0; } 補充說明(Supplement): Q2 : 手邊全都用 C 語言開發,日前是為養成良好習慣且方便移植,所以還是用 .c 但發現 VC 對於 .c 支援實在是差到一種程度! 若日後將所有 .c 全都改成 .cpp (仍是以 C 開發), 試問此舉是否為埋下地雷之作法? 問題有些長,謝謝各位細心看完,非常感激! -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222

04/29 16:58, , 1F
一般正常的 (沒特別修改) C 函數,反組譯後的 Prologue
04/29 16:58, 1F

04/29 16:59, , 2F
或 Prolog 在寫什麼有看懂,應該就能理解 naked、fastcall
04/29 16:59, 2F

04/29 17:17, , 3F
反組譯..是從 exe 反組回去嗎?這部份還真沒研究 XD
04/29 17:17, 3F

04/29 17:17, , 4F
謝謝 purpose 指引方向.
04/29 17:17, 4F

04/29 17:18, , 5F
順帶一問,VC(旗鑑) 裡是否有tool 可反組譯?
04/29 17:18, 5F

04/29 17:31, , 6F
比如說,你用VC在自己的main下中斷點,然後開始偵錯,停在
04/29 17:31, 6F

04/29 17:32, , 7F
該中斷點,這時候按右鍵應該有「移至反組譯碼」就是了
04/29 17:32, 7F

04/29 17:33, , 8F
數學加速什麼的我完全不懂,但是他這個Sqrt14乍看之下
04/29 17:33, 8F

04/29 17:33, , 9F
很有趣,他用inline表示不想變成函數。卻又用__fastcall這
04/29 17:33, 9F

04/29 17:34, , 10F
個呼叫慣例,想要把n用暫存器來傳送,偏偏最後又從esp+4
04/29 17:34, 10F

04/29 17:35, , 11F
這個「記憶體」位址去將浮點數載入CPU,而且也只是用普通
04/29 17:35, 11F

04/29 17:35, , 12F
x87指令集裡的fsqrt來達成,關鍵部份都是CPU在做而已
04/29 17:35, 12F

04/29 17:47, , 13F
試了一下,真的可以看 asm code,謝謝 purpose 指教!!
04/29 17:47, 13F
文章代碼(AID): #1DkdgUE9 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DkdgUE9 (C_and_CPP)