解析:
在這裡宣告,簡單的比較字首自增運算子和字尾自增運算子的效率是片面的,因為存在很多因素影響這個問題的答案。首先考慮內建資料型別的情況:如果自增運算表示式的結果沒有被使用,而是僅僅簡單的用於增加一員運算元,答案是明確的,字首法和字尾法沒有任何區別,編譯器的處理都應該是相同的,很難想象得出有什麼編譯器實現可以別出心裁在二者之間製造任何差異。我們看看下面這個程式:
#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++)必須產生乙個臨時物件儲存更改前物件的值並返回(實現過自定義型別++運算子定義的就知道),所以導致在大物件的時候產生了較大的複製開銷,引起效率降低,因此處理使用者自定義型別(注意不是指內建型別)的時候,應該盡可能的使用字首式地增/遞減,因為他天生體質較佳。
答案:內建資料型別的情況,效率沒有區別。
自定義資料型別的情況,++i效率較高。
面試題 i 和 i哪個效率更高
include int main 簡單地比較字首自增運算子和字尾自增運算子的效率是片面的,因為存在很多因素影響這個問題的答案。考慮內建資料型別的時候,它們的效率差別不大 去除編譯器的影響 考慮自定義資料型別 主要是指類 的情況。此時我們不需要再做很多彙編 的分析,因為字首式 i 可以返回物件的引用,...
i 相比 i 哪個更高效 為什麼?
i的效率高些,i在運算過程中不產生臨時物件,返回的就是i,是個左值,類似 i 1這樣的表示式是合法的,而i 在運算的過程中會產生臨時物件,返回的是零時物件的值,是個右值,像i 1這樣的表示式是非法的 對於內建型別,單獨的i 和 i語句,現在的編譯器基本上都會優化成 i,所以就沒什麼區別。考慮內建資料...
i 與 i效率比較
1.對於i是內建型別,效率無差別,編譯器會自動優化 2.對於i為非內建型別,效率會存在不同,主要體現在其功能作用不同,i是將i值自增後返回,而i 是返回 i 的臨時變數,同時將i自增。可以猜想其過載操作符實現邏輯與下面 類似 classname classname operator classnam...