i++和++i真的沒區別麼?i+=1和i=i+1真的沒區別麼
阿新 • • 發佈:2019-02-06
寫篇文章記錄下小知識點。
首先是i++和++i,我這裡說的是效能問題,而不是該等於i呢還是等於i+1呢這麼基礎的問題,其實效能大家仔細想想也很容易知道,++i的效能比i++的效能好,但是我們程式中如果在不受影響的情況下,都會使用i++;其實這是不太好的做法,至少效能上稍微不太好。
++i模擬:
int fuction()
{
i=i+1;
return i;
}
i++模擬:
int function()
{
int temp=i;
i=temp+1;
return temp;
}
i++多了個temp,效能上沒有++i好,建議大家在不影響程式邏輯的前提下還是選擇++i吧。。
然後是i+=1和i=i+1的問題,給大家一個經常可以看到的例子吧。下面的說法是建立在不存在自動強制型別轉換的語言上的,例如:Java,不包括C++喲。
example1:
short i=1;
i=i+1;
example2:
short i=1;
i+=1;
基於那個前提下,example1中肯定會出現編譯問題,把int賦給short是不行的,但是example2是沒有問題滴。。
如果我現在說我剛才說的不對你肯定會噴我,但確實是這樣。。經過我的驗證,其實++i和i++和i=i+1的效能是一樣的。至少對內建內型是這樣的。
給你看看彙編程式碼就知道了。
int i=4;
++i;
i++;
i=i+1;
52: ++i;
0040159F mov eax,dword ptr [ebp-4]
004015A2 add eax,1
004015A5 mov dword ptr [ebp-4],eax
53: i++;
004015A8 mov ecx,dword ptr [ebp-4]
004015AB add ecx,1
004015AE mov dword ptr [ebp-4],ecx
54: i=i+1;
004015B1 mov edx,dword ptr [ebp-4]
004015B4 add edx,1
004015B7 mov dword ptr [ebp-4],edx
都只用到了一個暫存器而已,程式碼行都是3行。效能差???不是吧。。網上經常看的是++i>i++>i=i+1。但我還是堅持自己的觀點。。
但是注意我剛才說的是內建型別。如果對於我們的非內建型別,那會是怎樣的呢?
我過載了前置++和後置++運算子。如:
class Date
{
public:
Date(int d=0,int m=0,int y=0):day(d),month(m),year(y)
{
}
Date& operator++()//前置
{
++day;
return *this;
}
Date operator++(int)//後置
{
Date date=*this;
++day;
return date;
}
private:
int day;
int month;
int year;
};
Date date(9,10,2013);
++date;
date++;
56: Date date(9,10,2013);
004015D4 push 7DDh
004015D9 push 0Ah
004015DB push 9
004015DD lea ecx,[ebp-10h]
004015E0 call @ILT+35(Date::Date) (00401028)
57: ++date;
004015E5 lea ecx,[ebp-10h]
004015E8 call @ILT+385(Date::operator++) (00401186)
58: date++;
004015ED push 0
004015EF lea ecx,[ebp-1Ch]
004015F2 push ecx
004015F3 lea ecx,[ebp-10h]
004015F6 call @ILT+515(Date::operator++) (00401208)
這樣確實++date的效能是要好一點,我們通過看原始碼就知道了,不需要看彙編。所以對於自定義型別是有這個區別的,也不枉我們前面的那一段廢話。
所以我的觀點:對於內建型別是沒有區別的,對於自定義型別是有區別的。