看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《tropical72 (藍影)》之銘言: : 開發平台(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 還是可以正常執行, 看起來似乎不影響結果。 compiler 在生成 machine code 時,會在 function 前後加上一些 code 用來處理 stack、保留 register 的值等等,這些 code 稱為 prolog/epilog __declspec (naked) 就是叫 compiler 不要生這些 code 一般 function 在傳參數時是透過 stack,但這樣比較慢 __fastcall 是叫 compiler 改用 register 傳 __declspec (naked) 加不加不影響是因為這個 sqrt14 這個 function 只用了 fpu,沒有動到其它的 register,所以沒有 prolog/epilog 也沒關係 __fastcall 加不加也不影響結果 加了的話 compiler 會儘可能幫你用 register 傳參數 不行的話還是會用 stack : 錯誤結果(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 支援實在是差到一種程度! ........................ 在確定問題的真相前,請不要任意怪罪 compiler... 副檔名是 .c 的話 vc2008 預設會當成是 c 語言的 code 而 vc2008 只支援的 c90,c90 裡並沒有 inline 所以當然會有語法錯誤 : 若日後將所有 .c 全都改成 .cpp (仍是以 C 開發), : 試問此舉是否為埋下地雷之作法? 基本上用了 __declspec(naked) 和 __fastcall 這種特定 compiler 專有的功能 就完全無法任意移植到別的 compiler 了 再加上 sqrt14 用了 inline assembly,就更別想要方便移植了 附帶一提,根據 __declspec(naked) 的說明,naked function 不能為 inline 所以加不加 inline 基本上沒有差別 另外是 naked function 只能用在 x86,x64 和 itanium 都不能用 http://msdn.microsoft.com/zh-tw/library/h5w10wxs(v=VS.90).aspx : 問題有些長,謝謝各位細心看完,非常感激! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.49
tropical72:大推,說得很清楚,謝謝耐心指導! 04/29 17:50
james732:長知識推! 04/29 17:51
Ebergies:我想它只是把所有看似能加速的東西都加上去而已吧... 04/29 19:58
Ebergies:應該沒想太多它們的意義 04/29 19:59
loveme00835:!! 04/29 22:33
VictorTom:長知識推:) 04/29 23:43
softwind:對這個有興趣可以去看GCC的 extension 為了Linux訂做 XD 04/30 00:16
aecho:長知識推!! 04/30 10:27
scan33scan33:長知識推~ 04/30 15:34
silveriii:推~講得很清楚 05/01 15:19