1. 程式人生 > >i++和++i真的沒區別麼?i+=1和i=i+1真的沒區別麼

i++和++i真的沒區別麼?i+=1和i=i+1真的沒區別麼

寫篇文章記錄下小知識點。

首先是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的效能是要好一點,我們通過看原始碼就知道了,不需要看彙編。所以對於自定義型別是有這個區別的,也不枉我們前面的那一段廢話。

所以我的觀點:對於內建型別是沒有區別的,對於自定義型別是有區別的。