目录
[显示]

1.摘要

看到有人说:“i++ 会需要额外保存自增前的值(作为返回值),++i 只是自增变量并将变量自己返回,所以i++会比++i快一点”,那么真的是这样吗?

2. 问题

上网找了找,关于i++和++i两个速度为什么有区别,大致是这么一个说法:

计算机内部实现过程有别,详细如下:
i=i+1的过程相当:
  temp=i+1; i=temp;
i++的过程相当:
  temp=i; i=temp+1; return temp;
++i的过程最简单:
i增1然后return i 的值,一步完成,没有给任何temp变量赋值

最早是在[http://bbs.chinaunix.net/thread-388165-1-1.html]的1楼发表。
为了验证这个问题我写了一下测试程序,分别以下用4个编译器做测试(我手里只有这几个):
javac 1.6.0_26
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
arm-none-linux-gnueabi-gcc (ctng-1.6.1) 4.4.3
mipsel-linux-gcc (GCC) 4.1.2

3. 测试程序

Java:

C:

javac使用默认选项,gcc使用-g -O0 参数,objdump使用-S参数


4. 反编译结果

java:

gcc:

arm-none-linux-gnueabi-gcc (ctng-1.6.1) 4.4.3:

mipsel-linux-gcc (GCC) 4.1.2

5. 结论

java:
1、for循环中的i++和++i完全没有区别。
2、需要赋值的情况下字节码指令相同,顺序不同。

gcc:
1、for循环中的i++和++i完全没区别。
2、需要赋值的情况下机器指令完全相同,顺序不同。

arm-linux-gcc:
1、for循环中的i++和++i完全没区别
2、赋值语句的机器指令完全相同,顺序不同
3、调用语句中,i++比++i多一条mov r0, r3 指令,其余指令相同,使用寄存器不同,指令顺序不同。

mipsel-linux-gcc:
1、for循环中的i++和++i完全没区别
2、赋值语句的机器指令完全相同,顺序不同
3、调用语句中,i++比++i多一条move a0,v1 指令,其余指令相同,使用寄存器不同,指令顺序不同。

以上结论针对的是-O0,没有测试O2下的区别。
还看到这么一篇文章:
http://blog.csdn.net/zy1691/article/details/4849808
其中有这么一段:

但是我看了半天也没看出两段代码究竟有什么区别。。。