交换两个值,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