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的性能是要好一点,我们通过看源代码就知道了,不需要看汇编。所以对于自定义类型是有这个区别的,也不枉我们前面的那一段废话。

所以我的观点:对于内置类型是没有区别的,对于自定义类型是有区别的。

你可能感兴趣的:(C++)