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