关于 i++ 和 ++i 在C++中的效率问题(转载)

单独的一句  i++  或  ++i  作用是一样的,不少书上都说推荐写成  ++i  的形式,却从来没说明道理。  
为什么要推荐写成  ++i  呢?  
 
---------------------------------------------------------------  
 
i++;  //  有一个临时变量  
++i;  //  无临时变量  
---------------------------------------------------------------  
 
收的一篇文章:  
 
 
for  (  int  i  =  0;  i  <  100;  i++  )    
{    
       /*  …………  */    
}  
 
 
但是很少有人想过代码背后隐藏的问题。读过STL源代码的人,都会对下面的代码一定很熟悉。    
 
 
template<class  _II,  class  _OI>  inline    
_OI  copy(  _II  _F,  _II  _L,  _OI  _X  )    
{    
       for  (  ;  _F  !=  _L;  ++_X,  ++_F  )    
               *_X  =  *_F;    
       return  (_X);    
}    
//  摘自Visual  C++  6.0  STL实现,文件:xutility。    
 
   
 
为什么它不写成    
 
 
template<class  _II,  class  _OI>  inline    
_OI  copy(  _II  _F,  _II  _L,  _OI  _X  )    
{for  (  ;  _F  !=  _L;  _X++,  _F++  )    
       *_X  =  *_F;    
       return  (_X);    
}  
 
 
看完这篇文章,你就可以知道这样写的理由。    
 
C++是一种非常强大的语言,它赋予了它的使用者和他的创建者相同的权力。每一个内在的数据类型所支持的操作,你几乎都可以为自己定义的类型实现。运算符重载是其中的重要组成部分。    
 
对于一个类CInt的运算符(这里只讨论加法),我们一般会这样实现:    
 
 
class  CInt    
{    
public:    
       CInt&  operator  ++();    
       CInt  operator  ++(  int  );    
       CInt&  operator  +=(  const  CInt&  that  );    
};    
 
CInt  operator  +(  const  CInt&  this,  const  CInt&  that  );  
 
 
其中,CInt&  operator  ++();对应于++i;(如果i是CInt的一个实例,下同)返回引用的原因是因为在C++里,++i的结果应该是一个左值。对这个函数的调用,除了运算本身以外,并没有什么开销。(除了隐含的this以外,无传递参数,只有一个引用返回值,所以没有新的实例被创建)    
CInt  operator  ++(  int  );  对应于i++;那个int是无意义的,只是为了把前缀运算和后缀运算区分开。返回变量(而不是引用)的原因是因为在C++里,i++的结果应该是一个右值,并且是i在没有加之前的值(所以不能返回它的const引用)。在这个函数中,会创建一个临时变量,并把它作为返回值拷贝给调用者。    
CInt&  operator  +=(  const  CInt&  that  );对应于i  =  i  +  j;传递一个参数,从理论上来说,它的开销和++I的开销是一样的,但是,如果你只是要对类的实例加一的话,应该用++I,因为那个函数可能为加一而特别优化过。(具体可以参见实例)    
CInt  operator  +(  const  CInt&  this,  const  CInt&  that  );对应于k  =  i  +  j;这个函数的开销与i++相同,但是要注意的是,i++可能为加一而优化的。    
 
为了能够显著的测出各个函数的具体效率,我使用了一个非常"大"的类,CVector,一个65536维的整型向量。测试结果为:    
 
Another  +=  One  :  4326    
Another++  :  9274    
Another  =  Another  +  One  :  9223    
++Another  :  2153    
 
可以看出,同样是加一,++i可以比i++快很多。    
 
当然,编译器的优化也很重要,在某些情况下,编译器可以将i++的速度优化到和++i一样。但是,为什么不直接写出++i呢?这样可以保证在任何情况下都能获得较快的执行速度,而不是去依赖于编译器的优化。(至少,Visual  C++  6.0是不支持的)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值