编程的时候应该尽可能使用递增操作符 ++ 和递减操作符 -- 的前缀形式.因为它少创建两个临时对象,效率比较高.
还是从代码来分析吧,比较有说服力:)
下面是 ++ 和 -- 的前缀实现形式:
T& T::operator++(){ T& T::operator--(){
++*this; --*this;
return *this; return *this;
} }
下面是 ++ 和 -- 的后缀实现形式:
T T::operator++(int){ T T::operator--(int){
T old(*this); T old(*this);
++*this; --*this;
return old; return old;
} }
我们来分析一下自增自减的后缀形式所多花费的开销:
T old(*this);
这一句产生一个类型为T的临时对象 old, 并用原值*this进行初始化.当函数return的时候,又再次创建一个临时对象,并用old的值进行初始,之后,局部变量old被销毁.并用临时创建的变量对赋值符左边的变量进行赋值(如果有的话).赋值后,临时变量再次被销毁.
而前缀形式的自增自减呢?首先函数内没有创建临时变量,故这方面的开销就节省了.其次,返回的是一个引用,故也节省了这时候创建销毁临时对象的开销.
因此后缀式的自增自减,所多花费的开销是两次临时变量的创建,以及两次临时变量的销毁.如果自增自减的对象不是内建的数据类型,而一个类类型[当然,你首先得重载自增自减操作符:) ], 那么这个开销可能会比较大.因为变成了两次构造函数以及两次析构函数的调用.
所以在调用代码的时候,要优先使用前缀形式,除非确实需要后缀形式返回原值.
参考书籍: C++ 编程规范
作者: Herb Sutter
Andrei Alexandrescu