您可以使用
-O3 -S
选项运行gcc以生成优化的汇编代码,这样您就可以看到(并比较)优化后的汇编代码。我对您的源代码进行了以下更改,以使其编译通过。
文件
a.c:
int b;
int foo (int a) {
if ((a > 0) && (a < 5000)) {
b = a;
return 0;
} else {
return 1;
}
return 0;
}
文件 b.c:
int b;
int foo (int a) {
if ((a > 0) && (a < 5000)) {
b = a;
return 0;
}
return 1;
}
使用gcc -O3 -S a.c
编译a.c会创建文件a.s。在我的机器上,它的外观如下:
.file "a.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
movl 4(%esp), %edx
movl $1, %eax
leal -1(%edx), %ecx
cmpl $4998, %ecx
ja .L2
movl %edx, b
xorb %al, %al
.L2:
rep
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.comm b,4,4
.ident "GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
.section .note.GNU-stack,"",@progbits
在使用
gcc -O3 -S b.c
编译
b.c 后,会生成文件
b.s。在我的机器上,它看起来是这样的:
.file "b.c"
.text
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
movl 4(%esp), %edx
movl $1, %eax
leal -1(%edx), %ecx
cmpl $4998, %ecx
ja .L2
movl %edx, b
xorb %al, %al
.L2:
rep
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.comm b,4,4
.ident "GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
.section .note.GNU-stack,"",@progbits
请注意,
foo:
的汇编实现是相同的。因此,在这种情况下,使用这个版本的GCC编写代码的方式并不重要。
if
和else
都有一个return
语句,那个最终的return
语句将永远不会被执行到。 - Drew McGowenbool c = 0 < a && a < SOME_LIMIT; if (c) { b = a; } return c;
是我最喜欢的代码片段。 - Joop Eggenreturn ((a > 0) && (a < SOME_LIMIT)) ? b = a, 0 : 1;
但即使它能工作,也不是很清晰。 - Kninnugif ((unsigned)(a-1) < SOME_LIMIT-1) ...
是一个很好的微观优化。但正如其他人所说,每个编译器都不同,因此如果你真的关心的话,最好查看汇编输出和/或进行性能分析。 - Nemo