以前还真不知道,特地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的效率区别