1. 程式人生 > >【轉載】 for迴圈中i++與++i的效率探究

【轉載】 for迴圈中i++與++i的效率探究

原文連結:https://blog.csdn.net/zy1691/article/details/4849808?utm_source=blogxgwz1

for(int i=0;i<=50;i++)

 

我們經常會使用這樣的程式碼來做迴圈,一般在for迴圈中習慣於使用i++,卻很少使用++i。雖然從程式碼執行的效果來看,它們並無任何區別,但是它們所生成的程式碼是有有所不同的。

 

i++  :先引用後增加

++i  :先增加後引用

 

意思就是說就是

 

i++  :先在i所在的表示式中使用i的當前值,後讓i加1

++i  :讓i先加1,然後在i所在的表示式中使用i的新值

 

i++由於是在使用當前值之後再+1,所以會需要一個臨時變數來轉儲,而++則直接+1,不存在這樣的問題。
這樣考慮的話就會得出使用++i要優於i++的結論,是否真的如此?
還是讓程式碼來說明一切吧。

試驗使用如下程式碼:

 

 int c=0;
 for(int i=0;i<=50;i++)
  c=c+i;
 std::cout<<c;


首先在debug下編譯:


i++情況

; 9    :  int c;
; 10   :  for(int i=0;i<=50;i++)

 mov DWORD PTR _i$20035[ebp], 0
 jmp SHORT [email protected]
[email protected]:
 mov eax, DWORD PTR _i$20035[ebp]
 add eax, 1
 mov DWORD PTR _i$20035[ebp], eax
[email protected]:
 cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H
 jg SHORT

[email protected]

; 11   :   c=c+i;

 cmp BYTE PTR $T25811[ebp], 0
 jne SHORT [email protected]
 push OFFSET [email protected]
 call __RTC_UninitUse
 add esp, 4

 

++i情況

; 9    :  int c;
; 10   :  for(int i=0;i<=50;++i)

 mov DWORD PTR _i$20035[ebp], 0
 jmp SHORT [email protected]
[email protected]:
 mov eax, DWORD PTR _i$20035[ebp]
 add eax, 1
 mov DWORD PTR _i$20035[ebp], eax
[email protected]:
 cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H
 jg SHORT [email protected]

; 11   :   c=c+i;

 cmp BYTE PTR $T25811[ebp], 0
 jne SHORT [email protected]
 push OFFSET [email protected]
 call __RTC_UninitUse
 add esp, 4
[email protected]:
 mov eax, DWORD PTR _c$[ebp]
 add eax, DWORD PTR _i$20035[ebp]
 mov BYTE PTR $T25811[ebp], 1
 mov DWORD PTR _c$[ebp], eax
 jmp SHORT [email protected]
[email protected]:

 

可以看出++i確實省去了對記憶體操作的環節,直接add eax, 1,用++i真的能提高效能。
當然,上面是用debug版本,也就是說沒有優化,那麼在release優化的情況下會怎樣呢。
繼續試驗

 

i++優化
; 9    :  int c;
; 10   :  for(int i=0;i<=50;i++)

 mov ecx, DWORD PTR _c$[esp+4]
 xor eax, eax
[email protected]:

; 11   :   c=c+i;

 add ecx, eax
 inc eax
 cmp eax, 50     ; 00000032H
 jle SHORT [email protected]

 

++i優化

; 9    :  int c;
; 10   :  for(int i=0;i<=50;++i)

 mov ecx, DWORD PTR _c$[esp+4]
 xor eax, eax
[email protected]:

; 11   :   c=c+i;

 add ecx, eax
 inc eax
 cmp eax, 50     ; 00000032H
 jle SHORT [email protected]

 

 

結論:在沒有編譯器優化的情況下,++i更好。優化過後兩者都一樣,看起來似乎喜歡怎樣寫都無所謂了。

但是如果這裡的i不是int而是迭代器,那麼++在前和在後就會有所不同,使用++i將會有切實的更高的效率。雖然int情況下沒多少區別,但為了語法上的統一,最好一律改用++i這種形式。

 

所以,建議在這種地方一律改用++i的形式。