前缀和后缀运算符在效率上的小区别

 前缀和后缀运算是很基本的运算,我相信所有学过c语言和c++的人都能很好得理解他们的含义,他们的区别也是很细微的,在运行效率上有一个很小的不同。当然如果在一个很大的程序里,你的数据结构和算法不优良的时候,这样的效率改变往往是不能对大局有所改变的,就像80-20规则告诉我们的那样,但是既然他们有差异,我们为什么在必要的时候不用更有效率的呢?

   这要从i++和++i的实现上来说了,我们都知道,i++是先取回操作数,然后增加操作数,而++i是先对操作数增值,然后取回,所以对这两个的操作符的实现也是给予这样的现实的。但是我们会发现遇到了一个麻烦,对于这样的两个一样的运算,我们没有办法区别他们的重载版本。为了解决这样的问题,在后缀运算符的重载版本里,编译器会默认添加一个int值以区分两个版本。

  实现如下

//prefix

template<T>class EXM{....}
EXM<T>& EXM::operator++()
{
   *this += 1;
   return pre;
}
//postfix

template<T>class EXM {...}
const EXM<T> EXM::operator++(int)
{
    T temp = *this;
    *this += 1;
    return temp;
}
 

为了不让编译器发出有一个没有用到的参数这样的警告,我们在postfix函数的形参只声明了类型。

也许你觉得奇怪,为什么两个函数的返回值类型不一样,先考虑这样的代码

EXM i;

i++++;

第一内建的类型不允许对操作数做连续的这样的行为。而且

你认为这样的代码为i增值了几次呢?2次?错了,实际上是一次。这是因为等效于一下的代码

i.operator++(0).operator++(0)而这样的调用第一个返回了一个const引用,而operator++(int)不是一个const函数,于是不能得到正确的调用,所以自增了一次,这个行为具有迷惑性,所以还是不写这样的代码为好

回到我们的论题,可以发现,在后缀的实现里,需要开辟临时对象,这样在结束的时候的就需要删除临时对象,这样在大的程序里,也许会有效率的损失,所以在可以的情况下,尽量使用前缀++吧~


文章出处:http://www.diybl.com/course/3_program/c++/cppsl/20081117/151377.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值