作者tropical72 (藍影)
看板C_and_CPP
標題[問題] __fastcall / inline
時間Fri Apr 29 16:45:14 2011
開發平台(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
推 purpose:一般正常的 (沒特別修改) C 函數,反組譯後的 Prologue 04/29 16:58
→ purpose:或 Prolog 在寫什麼有看懂,應該就能理解 naked、fastcall 04/29 16:59
→ tropical72:反組譯..是從 exe 反組回去嗎?這部份還真沒研究 XD 04/29 17:17
→ tropical72:謝謝 purpose 指引方向. 04/29 17:17
→ tropical72:順帶一問,VC(旗鑑) 裡是否有tool 可反組譯? 04/29 17:18
推 purpose:比如說,你用VC在自己的main下中斷點,然後開始偵錯,停在 04/29 17:31
→ purpose:該中斷點,這時候按右鍵應該有「移至反組譯碼」就是了 04/29 17:32
→ purpose:數學加速什麼的我完全不懂,但是他這個Sqrt14乍看之下 04/29 17:33
→ purpose:很有趣,他用inline表示不想變成函數。卻又用__fastcall這 04/29 17:33
→ purpose:個呼叫慣例,想要把n用暫存器來傳送,偏偏最後又從esp+4 04/29 17:34
→ purpose:這個「記憶體」位址去將浮點數載入CPU,而且也只是用普通 04/29 17:35
→ purpose:x87指令集裡的fsqrt來達成,關鍵部份都是CPU在做而已 04/29 17:35
→ tropical72:試了一下,真的可以看 asm code,謝謝 purpose 指教!! 04/29 17:47