- 论坛徽章:
- 0
|
测试程序:
- #include "stdio.h"
- int foo(int *p)
- {
- return(p? *p: 0);
- }
- int main(void)
- {
- int i = 10;
- int b;
- b = foo(&i);
- printf("b = %d\n",b);
- b = foo(0);
- printf("b = %d\n",b);
- return 1;
- }
复制代码 gcc -O3的汇编
- foo:
- .LFB22:
- .cfi_startproc
- movl 4(%esp), %edx
- xorl %eax, %eax
- testl %edx, %edx
- je .L2
- movl (%edx), %eax
- .L2:
- rep
- ret
复制代码 执行结果:
kimi@ubuntu:~$ gcc -O3 -o test test.c
kimi@ubuntu:~$ ./test
b = 10
b = 0
gcc -O2的汇编-
- foo:
- .LFB22:
- .cfi_startproc
- movl 4(%esp), %edx
- xorl %eax, %eax
- testl %edx, %edx
- je .L2
- movl (%edx), %eax
- .L2:
- rep
- ret
复制代码 执行结果
kimi@ubuntu:~$ gcc -O2 -o test test.c
kimi@ubuntu:~$ ./test
b = 10
b = 0
gcc -O1的汇编
- foo:
- .LFB22:
- .cfi_startproc
- movl 4(%esp), %edx
- movl $0, %eax
- testl %edx, %edx
- je .L2
- movl (%edx), %eax
- .L2:
- rep
- ret
复制代码 执行结果:
kimi@ubuntu:~$ gcc -O1 -o test test.c
kimi@ubuntu:~$ ./test
b = 10
b = 0
说真的,三种优化选项都用了,真没看出有什么bug.
testl都是先跳转,后引用!!
gcc 版本4.6
|
|