作者ccbruce (今、そこに いる僕)
看板C_and_CPP
標題Re: [問題] 基本觀念的小問題
時間Sun Aug 29 23:51:35 2010
※ 引述《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