05月22, 2007

i++,i+=1,i=i+1 哪个效率更高?

今天看到这么一道题:

i++,i+=1,i=i+1哪个效率更高?为什么

给出的解答是:

x=x+1最低,执行过程: 1)读取右边x的地址 2)x+1 3)读取左边x的地址 4)将右值给左边的x(编译器并不认为左右x的地址相同) (编译器不会这么笨吧,两个x还能有不一样的地址??)

x+=1次之,过程: 1)读取右边x的地址 2)x+1 3)将得到的值给x(因为x的地址已经读出)

x++的效率最高,过程: 1)读取右边x的地址 2)x自增1

所以x++的效率最高....

怀疑~~

不知道上面所说的过程是从什么角度来评价效率的

按我说,效率应该从产生的指令数和指令类型综合起来说

研究下列c++代码:

int
main(int,char**)
{
int i=1;
i++;
i+=1;
i=i+1;
return 0; 
}

cl.exe产生的汇编代码如下:

; Line 5
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
; Line 6
mov ecx, DWORD PTR _i$[ebp]
add ecx, 1
mov DWORD PTR _i$[ebp], ecx
; Line 7
mov edx, DWORD PTR _i$[ebp]
add edx, 1
mov DWORD PTR _i$[ebp], edx

g++产生的汇编代码如下:

; Line 5
leal -4(%ebp), %eax
incl (%eax)
; Line 6
leal -4(%ebp), %eax
incl (%eax)
; Line 7
leal -4(%ebp), %eax
incl (%eax)

编译器生成的汇编代码可能是经过不同成都优化的 用ollydbg查看最终exe的执行代码如下:

cl.exe产生的exe

g++产生的exe代码

可见无论cl还是g++对i++,i+=1,i=i+1的翻译都是一样的

只是cl将之翻译成3条指令,g++翻译成两条 所以说所以在上面这种情况下,i++,i+=1,i=i+1的效率是一样的!

本文链接:http://aztack.wang/post/3-increase-1-which-perf-best.html

-- EOF--

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。