看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
loveme00835:int const 是一個例外 08/30 00:10
tinlans:1. 其實還跟 calling convention 和 ISA 定址能力有關。 08/30 02:10
tinlans:有些架構可以做 byte addressing 有些不行。 08/30 02:11
tinlans:不過 calling convention 在制訂的時候就會考慮 ISA, 08/30 02:12
tinlans:所以如果沒有 byte addressing 應該會設計成對齊邊界。 08/30 02:13
final01:gcc不是有typeof? 08/30 13:23