• 五分钟小知识:为什么说 ++i 的效率比 i++ 高?


    点击蓝色“五分钟学算法”关注我哟

    加个“星标”,天天中午 12:15,一起学算法

    640?wx_fmt=jpeg

    作者 | 守望先生

    来源 | 编程珠玑

    前言

    不知道你是否听说过 ++i 比 i++ 快的说法,真的如此吗?

    ++i与i++的区别

    这两个表达式从我们初学编程语言的时候就会接触到。前者是自增后取值,后者是取值后自增

    #include <iostream>
    using namespace std;
    int main()
    {
        int a = 0;
        int b = 0;
        int c = a++;//int tmp = a;c=a;a = a + 1
        int d = ++b;//b = b + 1;d = b;
        cout<<"c="<<c<<";d="<<d<<endl;
        return 0;
    }
    

    运行结果:

    c=0;d=1  
    

    对于这个结果我们并不感到意外。

    另外我们还注意到另外一个有意思的现象:

    //来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
    #include <iostream>
    using namespace std;
    int main()
    {
        int a = 0;
        int b = 0;
        int *c = &(a++);
        int *d = &(++b);
        return 0;
    }
    

    编译后报错:

    main.cpp:7:19: error: lvalue required as unary ‘&’ operand
         int *c = &(a++);
    

    说&作用于左值,也就是说a++的结果并非左值。但++b的结果是左值。

    可简单理解左值和右值:

    • 左值,有名对象,可赋值

    • 右值,临时对象,不可被赋值

    运算符重载

    在《

    //来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
    class Test
    {
    public:
        Test& operator++();//前置自增
        const Test operator++(int);//后置自增
    private:
        int curPos; //当前位置
    };
    /*前置自增实现范式*/
    Test& Test::operator++()
    {
        ++curPos;      //自增
        return *this;  //取值
    }
    /*后置自增实现范式,为了与前置区分开,多了一个int参数,但从来没用过*/
    const Test Test::operator++(int)
    {
        Test tmp = *this;  //取值
        ++curPos;             //自增
        return tmp;
    }
    

    仔细观察后,我们发现前置自增,先自增,后返回原对象的对象;没有产生任何临时对象;而后置自增,先保存原对象,然后自增,最后返回该原临时对象,那么它就需要创建和销毁,这样一来,效率孰高孰低就很清楚了。

    在不进行赋值的情况下,内置类型前置和后置自增的汇编都是一样的呢!

    void test()
    {
      int i = 0;
      i++;
      //++i;
    }
    

    汇编:

    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-4], 0
    add     DWORD PTR [rbp-4], 1
    nop
    pop     rbp
    ret
    

    不过,赋值的情况下,并且不开启编译器优化,它们的汇编代码还是有差别的,有兴趣的可以试试。

    总结

    对于内置类型,前置和后置自增或者自减在编译器优化的情况下,两者并无多大差别,而对于自定义类型,如无特别需要,人们似乎更加偏爱前置自增或自减,因为后置自增常常会产生临时对象。

    但是,又能提高多少效率呢?

    640?

    有热门推荐?

    1.【程序员】

    2.【GitHub】

    3.【算法】

    4.【数据结构】

  • 相关阅读:
    CSS+js弹出居中的背景半透明div层
    多服务器Remoting
    【Matlab图像处理】学习笔记:二值图片
    [转]各种颜色相互转换算法的C语言源代码
    [转]Xilinx:ERROR:Xst:2035
    modelsim仿真xilinx IP DCM
    [转]MATLAB out of memory
    [转]解决Xilinx Platform Studio无法打开 设置 环境变量
    【Matlab图像处理】学习笔记:读取16进制RGB文档转为彩色图片
    【Matlab图像处理】学习笔记:提取图片的R,G,B分量
  • 原文地址:https://www.cnblogs.com/csnd/p/16675214.html
Copyright © 2020-2023  润新知