在看《程序員面試筆試寶典》時,發現了這樣一個問題,書中只給出了++i的效率高一些,但並沒有給出具體的解釋和說明。
在網上找到下面的答案:
1、從高級層面上解釋
++i 是i=i+1,表達式的值就是i本身
i++ 也是i=i+1,但表達式的值是加1前的副本,由於要先保存副本,因此效率低一些。
對於C++內置類型而言,大部分編譯器會做優化,因此效率沒什么區別。但在自定義類型上,就未必有優化,++i 效率會高一些。
2、從底層匯編來看內置類型
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、從重載運算符來看自定義類型
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
