引言
环境windows10,VS2019
1. 对基本数据类型而言,二者并无太大区别
以int类型为例,代码如下:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int b;
b = a++;
b = ++a;
return 0;
}
调试代码并转到反汇编如下
从反汇编的代码来看,前置++和后置++都用了五条汇编指令,也就是说对于基本数据类型,前置++和后置++在执行效率方面并不会有什么不同。
2. 对于自定义的数据类型,前置++效率更高
如果自定义了数据类型,要想实现++操作,需要进行函数重载,代码如下
#include<iostream>
using namespace std;
class Counter
{
private:
int count;
public:
Counter(int initialCount = 0) :count(initialCount)
{
cout << "Create class Counter" << endl;
}
~Counter()
{
cout << "Destroy class Counter" << endl;
}
Counter(const Counter& co) :count(co.count)
{
cout << "Copy create class Counter" << endl;
}
Counter(Counter&& co) :count(co.count)
{
co.count = 0;
cout << "Move create class Counter" << endl;
}
Counter& operator++()
{
++count;
return *this;
}
Counter operator++(int)
{
Counter temp(*this);
++count;
return temp;
}
int getCount() const
{
return count;
}
};
int main()
{
Counter c(10);
c++;
++c;
return 0;
}
在进行++运算符的重载时,后置++需要用到一个int形参以示区别。从上述代码可以看出,在实现后置++时,需要用到一个局部对象来存储原对象的旧值,然后再对原对象进行+1操作,最后返回局部对象。程序输出结果如下
从上面的结果可以分析,后置++操作要创建局部对象,返回时也要创建临时对象,而前置++是直接对原对象进行操作,不需要额外创建对象,所以后置++效率要低一些。尤其当进行for循环时,在每轮循环结束,如果都要进行对象的++操作,前置++效率要高的多。所以,在进行++操作时,如果对对象的旧值没有特殊的需求,尽量使用前置++。