解析:
在這裡宣告,簡單的比較字首自增運算子和字尾自增運算子的效率是片面的,因為存在很多因素影響這個問題的答案。首先考慮內建資料型別的情況:如果自增運算表示式的結果沒有被使用,而是僅僅簡單的用於增加一員運算元,答案是明確的,字首法和字尾法沒有任何區別,編譯器的處理都應該是相同的,很難想象得出有什麼編譯器實現可以別出心裁在二者之間製造任何差異。我們看看下面這個程式:
#include
int main()
上面的**在vc 6.0上編譯得到的彙編如下:
; line 5
mov dword ptr _i$[ebp], 0
; line 6
mov dword ptr _x$[ebp], 0
; line 8
mov eax, dword ptr _i$[ebp]
add eax, 1
mov dword ptr _i$[ebp], eax
; line 9
mov ecx, dword ptr _i$[ebp]
add ecx, 1
mov dword ptr _i$[ebp], ecx
; line 10
mov edx, dword ptr _i$[ebp]
mov dword ptr _x$[ebp], edx
mov eax, dword ptr _i$[ebp]
add eax, 1
mov dword ptr _i$[ebp], eax
; line 11
mov ecx, dword ptr _i$[ebp]
add ecx, 1
mov dword ptr _i$[ebp], ecx
mov edx, dword ptr _i$[ebp]
mov dword ptr _x$[ebp], edx
**段第8行和第9行生成的彙編**分別對應line 8和line 9下對應的彙編**,可以看到三個步驟幾乎完全一樣。
**段第10行和第11行生成的彙編**分別對應line 10和line 11下對應的彙編**,可以看到都是五個步驟,只是在加1的先後順序上有一些區別,效率也是完全一樣的。
由此說明,考慮內建資料型別時,它們的效率差別不大(去除編譯器優化的影響)。所以在這種情況下我們大可不必關心。
現在讓我們再考慮自定義資料型別(主要是指類)的情況。此時我們不需要再做很多彙編**的分析了,因為字首式(++i)可以返回物件的引用,而字尾式(i++)必須產生乙個臨時物件儲存更改前物件的值並返回(實現過自定義型別++運算子定義的就知道),所以導致在大物件的時候產生了較大的複製開銷,引起效率降低,因此處理使用者自定義型別(注意不是指內建型別)的時候,應該盡可能的使用字首式地增/遞減,因為他天生體質較佳。下面的**具體說明:
operator operator::operator++()
operator operator::operator++(int)
看到了嗎?後++必須要有乙個臨時物件才可以完成。所以他的效率自然就下降了!
答案:內建資料型別的情況,效率沒有區別。
自定義資料型別的情況,++i效率較高。
i 與 i效率比較
1.對於i是內建型別,效率無差別,編譯器會自動優化 2.對於i為非內建型別,效率會存在不同,主要體現在其功能作用不同,i是將i值自增後返回,而i 是返回 i 的臨時變數,同時將i自增。可以猜想其過載操作符實現邏輯與下面 類似 classname classname operator classnam...
i 與 i的效率差別
i 與 i的區別,我就不多說了。今天主要說明一下它們的效率上的差別。如果只是對內建資料型別 如int 兩者的差別很小,基本上沒有,這個可以從彙編 上看出來。但是如果對於c 裡的類,那 i和i 兩個是運算子過載,它們的區別就比較明顯了 i 和 i的 最重要的區別大家都知道就是 1和返回值的順序,但,兩...
i 與i 哪個效率更高?
解析 在這裡宣告,簡單的比較字首自增運算子和字尾自增運算子的效率是片面的,因為存在很多因素影響這個問題的答案。首先考慮內建資料型別的情況 如果自增運算表示式的結果沒有被使用,而是僅僅簡單的用於增加一員運算元,答案是明確的,字首法和字尾法沒有任何區別,編譯器的處理都應該是相同的,很難想象得出有什麼編譯...