交换两个值,swap。。。比如a=1,b=2;交换结果a=2,b=1;
代码1:
int main(){
int n=1000000000;
int a=10;
int b=100;
while(n-->0){
a^=b;
b^=a;
a^=b;
}
return 0;
}
代码2:
int main(){
int n=1000000000;
int a=10;
int b=100;
int c;
while(n-->0){
c=a;
a=b;
b=c;
}
return 0;
}
编译器gcc49,代码没有优化汇编代码如下:
汇编代码1:
_main:
LFB0:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $1000000000, -4(%rbp)
movl $10, -8(%rbp)
movl $100, -12(%rbp)
jmp L2
L3:
movl -12(%rbp), %eax
xorl %eax, -8(%rbp)
movl -8(%rbp), %eax
xorl %eax, -12(%rbp)
movl -12(%rbp), %eax
xorl %eax, -8(%rbp)
L2:
movl -4(%rbp), %eax
leal -1(%rax), %edx
movl %edx, -4(%rbp)
testl %eax, %eax
jg L3
movl $0, %eax
popq %rbp
LCFI2:
ret
汇编代码2:
_main:
LFB0:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl $1000000000, -4(%rbp)
movl $10, -8(%rbp)
movl $100, -12(%rbp)
jmp L2
L3:
movl -8(%rbp), %eax
movl %eax, -16(%rbp)
movl -12(%rbp), %eax
movl %eax, -8(%rbp)
movl -16(%rbp), %eax
movl %eax, -12(%rbp)
L2:
movl -4(%rbp), %eax
leal -1(%rax), %edx
movl %edx, -4(%rbp)
testl %eax, %eax
jg L3
movl $0, %eax
popq %rbp
LCFI2:
ret
执行时间:
a为swap1,b为swap2