从性能角度看前缀++和后缀++(++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
- 从性能角度看前缀++和后缀++(++i和i++的深入剖析)
- 从汇编角度看++i和i++(续:++i, i++, printf 和 程序的可移植性 问题)
- 操作符--自动递增和递减(前缀式和后缀式的区别、i++和++i区别)
- 【前缀自增/减++i】和【后缀自增/减i++】的区别
- 从JAVA字节码看++i 和i++ 的区别
- [Java] i++与++i的区别(后缀++与前缀++)
- 从MSIL角度分析.net中++i和i++具体的区别
- PHP中的前缀自增(++i) 和后缀自增 (i++)
- PHP中的(++i)前缀自增 和 (i++)后缀自增
- 关于i++和++i的性能问题
- i++和++i的区别--后缀运算符效率研究
- 从GC的角度看性能优化和性能计数器使用
- 乌龟和兔子 (从悖论的角度看)
- 从程序员的角度看总线和控制器(-)
- ++i,i++,--i和i--的区分
- 看代码写输出i++和++i的区别
- Java NIO系列1:从操作系统的角度剖析I/O
- Java NIO系列1:从操作系统的角度剖析I/O
- Win Socket网络编程
- 编译原理学习笔记一
- [每日一答] [20151027] R语言中的套接字socketConnection
- mapper映射文件配置之select、resultMap
- pandas小记:pandas基本设置
- 从性能角度看前缀++和后缀++(++i和i++的深入剖析)
- nodejs初学到express框架使用
- QtDesigner:Calculator Builder Example
- CString::TrimLeft和CString::TrimRight
- CODEVS1048石子归并
- 第一个cocos2dx-lua游戏--蚂蚁进洞
- 51nod 1368:黑白棋 二分图最大匹配
- 八皇后——递归学习
- 主线程和子线程的同步控制