Re: [問題] 基本觀念的小問題

看板C_and_CPP作者 (今、そこに いる僕)時間13年前 (2010/08/29 23:51), 編輯推噓1(105)
留言6則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《rosemary0401 (rosemary0401)》之銘言: : Question 1: : int funA(int i) : { : return i+1; : } : char funB(char i) : { : return i+1; : } : 請問funA和funB哪個比較快呢??為什麼?? : Question 2: : 用 #define A 50 : 和 int A = 50; : 哪個方法比較快呢??為什麼?? : 用 #define 來定義函數,執行起來會比較快嗎?? 1. 這個應該跟對齊有關。在32位元的系統中, 如果資料不是32位元的整數倍, Compiler 就會加入額外的機器碼來對齊資料, 所以會稍微慢一點。印象中是這樣。 2. 你想問的應該是巨集跟直接寫程式碼哪個比較快。我說啊, 你拿這個來比根本立足點 不同。以前課本的說法是, 巨集展開時會比較浪費Compile time, 目的碼比較肥(因為 是文字代換), 但是速度比較快。而函數呼叫Compile比較快, 目的碼比較瘦, 但是執行 比較慢。但你舉的例子完全無法比較速度, 因為你的#define會在編譯後直接變成程 式的r-value去了, 怎麼跟int A比啊?要嘛也是這樣比吧... #define SWAP(a, b) (a^=b^=a^=b) --- void swap(int &a, int &b) { a^=b^=a^=b; } 這樣我們就可以說SWAP比swap快一點, 但是目的碼肥一點, 而swap慢一點, 因為要推 東西進SS, 又要彈東西出SS, 還要維護EBP之類的。但是瘦一點就是。 但是在寫程式時, 千萬不能濫用巨集。否則你會嘿嘿嘿~~程式會變得像鬼畫符一樣。 更要命的的, 巨集沒有型別檢查的機制, 所以就算有亂七八糟的結果也不意外。 現在有inline-function, 用這個就很好了。 這些是很久以前的記憶了, 如果講錯的話, 請多包涵... --               裸になって                                                   何が悪い?      -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.57.76

08/30 00:10, , 1F
int const 是一個例外
08/30 00:10, 1F

08/30 02:10, , 2F
1. 其實還跟 calling convention 和 ISA 定址能力有關。
08/30 02:10, 2F

08/30 02:11, , 3F
有些架構可以做 byte addressing 有些不行。
08/30 02:11, 3F

08/30 02:12, , 4F
不過 calling convention 在制訂的時候就會考慮 ISA,
08/30 02:12, 4F

08/30 02:13, , 5F
所以如果沒有 byte addressing 應該會設計成對齊邊界。
08/30 02:13, 5F

08/30 13:23, , 6F
gcc不是有typeof?
08/30 13:23, 6F
文章代碼(AID): #1CUe8Cdu (C_and_CPP)
文章代碼(AID): #1CUe8Cdu (C_and_CPP)