楼上的有个问题我很想不明白 为什么交换数字用 a-=b;b+=a;a=b-a; ? 无论从可读性,和运行速度上,你这都是走下策(用于加密或许有一点点迷惑别人的意思) 下面是int c=a;a=b;b=c;VC编译后的指令 int a=12,b=21;
6 o e0 G \9 ]3 a" }mov dword ptr [ebp-4],0Ch3 d) k1 \/ f1 ]. M
mov dword ptr [ebp-8],15h
: Z( t4 S& _% L" `7 h, r int c=a;
+ ^* ` @0 j# R2 [+ q0 `+ O# ~, Lmov eax,dword ptr [ebp-4]
' @& x5 Y& ^9 Bmov dword ptr [ebp-0Ch],eax/ G& q. l- H6 z* u4 ]* t; n/ f
a=b;# R# f+ D1 P3 |5 y9 ?
mov ecx,dword ptr [ebp-8]) K: i* ^, n+ m2 L8 c
mov dword ptr [ebp-4],ecx( U. `1 a$ l! n/ C
b=c;
. K& G& a9 r3 @3 ?6 ^% y, vmov edx,dword ptr [ebp-0Ch]* [0 M/ A0 Z0 J* y
mov dword ptr [ebp-8],edx 下面是你的方法VC编译后的指令 a=12,b=21;2 r7 Z" V8 Y, l9 f& g* M
mov dword ptr [ebp-4],0Ch; z# t8 y4 m$ r5 [1 r$ l
mov dword ptr [ebp-8],15h+ t) c: `( |# I; ?2 J
a-=b;6 D9 E8 L" z+ d1 ?, H* W
mov eax,dword ptr [ebp-4]
: O0 l8 B& c! S/ m9 W# Ksub eax,dword ptr [ebp-8]; P+ y/ L e# W/ O* D6 ^; a7 o
mov dword ptr [ebp-4],eax
! g S- v; e2 ? b+=a;
3 J% K6 f; v( E. P, nmov ecx,dword ptr [ebp-8]
# e9 N, ?# t& L* ?6 f" `add ecx,dword ptr [ebp-4] G# L6 z. J+ r. ?) W7 O/ Z; s/ \
mov dword ptr [ebp-8],ecx- Q) |3 ^$ h8 E3 ~, E# o* t
a=b-a;
; b$ Q7 K: _0 @. d9 smov edx,dword ptr [ebp-8]5 y2 ]2 ]1 z& P9 o3 @
sub edx,dword ptr [ebp-4]
0 W X3 r- `9 J g r" Zmov dword ptr [ebp-4],edx
) U' m. ?2 M1 c2 g7 P8 D 很明显正规方法只有8条Mov指令, 而你的方法有8条Mov指令和2条Sub指令和1条Add指令 要知道,和Mov指令比起来Sub指令,Add指令是很费时间的! |