写篇文章记录下小知识点。
首先是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的性能是要好一点,我们通过看源代码就知道了,不需要看汇编。所以对于自定义类型是有这个区别的,也不枉我们前面的那一段废话。
所以我的观点:对于内置类型是没有区别的,对于自定义类型是有区别的。