C/C++面試題:i++與++i哪個效率更高?
阿新 • • 發佈:2019-01-05
解析:
在這裡宣告,簡單的比較字首自增運算子和字尾自增運算子的效率是片面的,因為存在很多因素影響這個問題的答案。首先考慮內建資料型別的情況:如果自增運算表示式的結果沒有被使用,而是僅僅簡單的用於增加一員運算元,答案是明確的,字首法和字尾法沒有任何區別,編譯器的處理都應該是相同的,很難想象得出有什麼編譯器實現可以別出心裁在二者之間製造任何差異。我們看看下面這個程式:
#include <stdio.h>
int main()
{
int i = 0;
int x = 0;
i++;
++i;
x = i++;
x = ++i;
return 0;
}
上面的程式碼在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效率較高。