鏈接:http://www.cnblogs.com/AndyJee/p/4550391.html
在看《程序員面試筆試寶典》時,發現了這樣一個問題,書中只給出了++i的效率高一些,但並沒有給出具體的解釋和說明。
在網上找到下面的答案:
1、從高級層面上解釋
++i 是i=i+1,表達式的值就是i本身
i++ 也是i=i+1,但表達式的值是加1前的副本,由於要先保存副本,因此效率低一些。
對於C++內置類型而言,大部分編譯器會做優化,因此效率沒什麼區別。但在自定義類型上,就未必有優化,++i 效率會高一些。
2、從底層彙編來看內置類型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
int a,i=0;
a=++i;彙編代碼如下: int a,i=0; 01221A4E
mov dword ptr [i],0 a=++i; 01221A55
mov eax,dword ptr [i] 01221A58
add eax,1 01221A5B
mov dword ptr [i],eax 01221A5E
mov ecx,dword ptr [i] 01221A61
mov dword ptr [a],ecx int a,i=0;
a=i++;彙編代碼如下: int a,i=0; 009E1A4E
mov dword ptr [i],0 a=i++; 009E1A55
mov eax,dword ptr [i] 009E1A58
mov dword ptr [a],eax 009E1A5B
mov ecx,dword ptr [i] 009E1A5E
add ecx,1 009E1A61
mov dword ptr [i],ecx |
從上述彙編代碼可以看到,對於內置類型,它們的執行數目是一樣的,效率沒有差別。
3、從重載運算符來看自定義類型
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Operator
Operator:: operator ++() { ++value; //內部成員變量 return * this ; } Operator
Operator:: operator ++( int ) { Operator
temp; temp.value=value; value++; return temp; } |
從上面代碼可以看出,後置++多了一個保存臨時對象的操作,因此效率自然低一些。
總結:
對於C++內置類型,兩者的效率差別不大;
對於自定義的類而言,++i 的效率更高一些。
參考文章:
http://www.cplusplus.me/1303.html