1. 程式人生 > >(C++)i++和++i,哪個效率高一些

(C++)i++和++i,哪個效率高一些

在看《程式設計師面試筆試寶典》時,發現了這樣一個問題,書中只給出了++i的效率高一些,但並沒有給出具體的解釋和說明。

在網上找到下面的答案:

1、從高階層面上解釋

++i 是i=i+1,表示式的值就是i本身

i++ 也是i=i+1,但表示式的值是加1前的副本,由於要先儲存副本,因此效率低一些。

對於C++內建型別而言,大部分編譯器會做優化,因此效率沒什麼區別。但在自定義型別上,就未必有優化,++i 效率會高一些。

2、從底層彙編來看內建型別

123456789101112131415161718192021int 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,101221A5B mov dword ptr [i],eax01221A5E mov ecx,dword ptr [i]01221A61 mov dword ptr [a],ecxint a,i=0; a=i++;彙編程式碼如下:int a,i=0;009E1A4E mov dword ptr [i],0a=i++;009E1A55 mov eax,dword ptr [i]009E1A58 mov dword ptr [a],eax009E1A5B mov ecx,dword ptr [i]009E1A5E add ecx,1
009E1A61 mov dword ptr [i],ecx

從上述彙編程式碼可以看到,對於內建型別,它們的執行數目是一樣的,效率沒有差別。

3、從過載運算子來看自定義型別

12345678910111213Operator 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