以前还真不知道,特地google和自己实现了下:
我不懂汇编...只看下它们是不是具有相同的指令
由于我电脑上没有,所以 vc下请看:http://
gcc/g++中
对于两个程序:
程序一:
int main()
{
int i=0;
int x=0;
x=i++;
}
程序2:
int main()
{
int i=0;
int x=0;
x=++i;
}
采用默认优化规则,
程序一汇编代码为:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $0, -4(%ebp)
movl $0, -8(%ebp)
movl -4(%ebp), %edx
leal -4(%ebp), %eax
incl (%eax)
movl %edx, -8(%ebp)
movl $0, %eax
leave
ret
程序二汇编代码为:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $0, -4(%ebp)
movl $0, -8(%ebp)
leal -4(%ebp), %eax
incl (%eax)
movl -4(%ebp), %eax
movl %eax, -8(%ebp)
movl $0, %eax
leave
ret
可以看到:i++和++i效率一样,只是汇编执行顺序(+1的先后)有差别。
而经过g++最高优化(-O3选项):
程序一汇编代码为:
pushl %ebp
movl $16, %eax
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
call __alloca
call ___main
leave
xorl %eax, %eax
ret
程序二汇编代码为:
pushl %ebp
movl $16, %eax
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
call __alloca
call ___main
leave
xorl %eax, %eax
ret
两者居然一样....(不懂汇编指令,应该有点差异才对...两者的最终x值不一样嘛)
综上:在内置的类型中,i++和++i效率是一样的(通过vc和gcc/g++得到的汇编指令得到证实)
其它自定义类型,据说 ++i 效率高一点,但没证实....
所以一般情况下,我们应该不用在意i++和++i的效率区别