(C++)i++和++i,哪個效率高一些
阿新 • • 發佈:2018-12-25
在看《程式設計師面試筆試寶典》時,發現了這樣一個問題,書中只給出了++i的效率高一些,但並沒有給出具體的解釋和說明。
在網上找到下面的答案:
1、從高階層面上解釋
++i 是i=i+1,表示式的值就是i本身
i++ 也是i=i+1,但表示式的值是加1前的副本,由於要先儲存副本,因此效率低一些。
對於C++內建型別而言,大部分編譯器會做優化,因此效率沒什麼區別。但在自定義型別上,就未必有優化,++i 效率會高一些。
2、從底層彙編來看內建型別
123456789101112131415161718192021 | 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、從過載運算子來看自定義型別
12345678910111213 | 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