从性能角度看前缀++和后缀++(++i和i++的深入剖析)

来源:互联网 发布:遗传算法编码方式 编辑:程序博客网 时间:2024/06/04 20:00

从性能角度看前缀++和后缀++(++i和i++的深入剖析)


    在初学很多编程语言的时候,经常会遇到前缀++和后缀++的问题,这两个操作让大家很难区分,并且容易混淆,这里就对其进行讲解,大家看完之后必定再也不会忘记,当然,这里还会从性能的角度来看待这个问题,大家耐心看下去便知。

    下面先来看一个例子。

int i = 0;int j = 0;int k = 0;j = i++;k = ++i;printf("i = %d, j = %d, k = %d.\n", i, j, k);

    这个例子很常见,最多就是表示形式不同,在VS2013中,运行结果是i = 2, j = 0, k = 2。从这个结果就可以对其进行分析了。

    "j = i++;"的分析:j之所以等于0,是因为后缀++,也就是i++,其实是先赋值后进行++计算的,也就是说i初值是0,先将0赋给j,然后i才++,此时j = 0, i = 1。

    "k = ++i;"的分析:k之所以等于2,是因为前缀++,也就是++i,其实是先进行++计算后赋值的,也就是此时i为1,然后先进行了++操作,i变为2,然后把i赋给k,此时k = 2, i = 2。

    最终的结果就是上面所看到的那样。大家只需要这样记忆:“前缀++处于前,所以理应先++后赋值;后缀++处于后,所以理应先赋值后++”。这样就可以记住这两个的区别了。

    那么我们从性能的角度来看看这两个操作的区别。大家在看很多教材的时候,可能会经常看到这样的例子结构。

for(int i = 0; i < 5; i++){    }

    基本上所有的教材都采用i++这种形式来进行“i的递增”,其实在这个时候i++和++i并没有什么运算结果的区别, 对程序的结果不会产生什么影响,所以使用++i或i++是一样的,但是很多书上喜欢直接用i++,也许这种形式已经成为大家的一种习惯,顺手拈来,就这样写了,也没有感觉什么不妥,但是很多专业的程序员喜欢这样写。

for(int i = 0; i < 5; ++i){}

    为什么他们喜欢用这种形式呢?这种形式和上面的区别就是把i++换成了++i,其实程序的执行结果是一模一样的,在两者皆可的时候,之所以采用++i而不是i++是因为,在执行++i的时候,底层直接在寄存器中对i进行了加1操作,然后保存在该寄存器中即可,而i++由于要先保存i的当前值,然后再加1,所以需要浪费一个寄存器用来存储i的当前值,然后对其执行加1操作后再保存加1后的值,所以相当于用了两个寄存器。当然,有些语言并不一定涉及了底层的概念,但是大家要知道,i++比++i多执行了一个缓存的操作,这个操作对结果没有什么影响,但是对执行效率却有一些小的影响,浪费了一些资源用来保存当前值。当然,在这些例子中,这些资源的浪费微乎其微,基本可以忽略,但是在庞大的系统中,可能就需要对效率锱铢必较了,有时候哪怕是1us也很重要,所以做底层的需要认识到这个问题。

    总之,大家首先要搞清楚前缀++和后缀++的区别,记住上面的那句话就可以了。然后,大家要清楚这两者对性能的微弱影响。
3 0