前缀和后缀操作符之间的选择

ZDNet软件频道 时间:2003-10-21 作者:ZDNet China |  我要评论()
本文关键词:cpptips
对于前缀和后缀操作符的选择,这里有一个规律:当在相同赋值情况下选择后缀和前缀操作符,你应该选择前缀操作符。
本文译自Builder.com,未经许可请勿转载当应用到比如整型和长整型的操作时,前缀和后缀操作符的性能区别通常可以忽略。然而,对于用户自定义类型,前缀操作符的效率要低于后缀操作符,这是因为在运行操作符之间编译器需要建立一个临时的对象。(在某些情况下,一个出色的编译器可以优化这些代码面避免临时对象的生成。)在以下的范例中,BigInt类定义了操作符++的前缀和后缀的不同操作。

classBigInt
{
public:
 BigInt & operator++();  // ++ BigInt
 BigInt operator++(int unused); // BigInt ++
//..
};

这两个不同的操作符的执行说明了它们在性能上的区别:

BigInt & BigInt::operator++()  // ++ BigInt is preferable
{
  AddDays(1); //increment  current object
  return *this; //return by reference the current object
}           

BigIntBigInt::operator++(int unused) // BigInt ++; less efficient
{    
  BigInttemp(*this); //copy of the current object
  AddDays(1); //increment current object
  return temp;  //return copy
}

虽然这些执行可以进一步的改进(例如,使用+=),但后缀操作符效率要低得多。除了调用一个成员函数,它还需要建立一个当前对象,并返回它的值。而对于前缀操作符,它需要调用一个成员函数和返回一个引用。为了对这两种操作符进行性能评价,可以使用后缀操作符运行,再用前缀操作符替换后缀操作符运行,然后检测这两个过程的时间。

对于前缀和后缀操作符的选择,这里有一个规律:当在相同赋值情况下选择后缀和前缀操作符,你应该选择前缀操作符。


本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。


责任编辑:炒饭

欢迎评论投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134