作者HuangTzHuan ()
看板C_and_CPP
標題Re: [問題] __fastcall / inline
時間Fri Apr 29 17:40:55 2011
※ 引述《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