Chinaunix首页 | 论坛 | 博客
  • 博客访问: 142594
  • 博文数量: 58
  • 博客积分: 1584
  • 博客等级: 上尉
  • 技术积分: 605
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-12 10:06
文章分类

全部博文(58)

文章存档

2011年(7)

2010年(51)

我的朋友

分类: C/C++

2010-05-16 22:07:49

关于 i++ 和 ++i 在C++中的效率问题
2008-10-28 01:27
  • 问题内容:关于 i++ 和 ++i 在C++中的效率问题
  • 原讨论链接:
  • 所属论坛: 审核组:
  • 提问者: 解决者:
  • 感谢:
  • 关键字:
  • 答案:

    单独的一句 i++ 或 ++i 作用是一样的,不少书上都说推荐写成 ++i 的形式,却从来没说明道理。 
    为什么要推荐写成 ++i 呢? 

    --------------------------------------------------------------- 

    i++; // 有一个临时变量 
    ++i; // 无临时变量 
    --------------------------------------------------------------- 

    收的一篇文章: 
    //////////////////////////////////////////////////////////////////// 

    for ( int i = 0; i < 100; i++ ) 

         /* ………… */ 



    但是很少有人想过代码背后隐藏的问题。读过STL源代码的人,都会对下面的代码一定很熟悉。 


    template 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 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是不支持的)

阅读(740) | 评论(0) | 转发(0) |
0

上一篇:c++中的指针2

下一篇:STL

给主人留下些什么吧!~~