所以我一直在看一下O3
GCC 中的一些魔法(实际上我正在使用Clang进行编译,但它与GCC相同,我猜测优化器的很大一部分是从GCC转到Clang) .
考虑这个C程序:
int foo(int n) {
if (n == 0) return 1;
return n * foo(n-1);
}
int main() {
return foo(10);
}
Run Code Online (Sandbox Code Playgroud)
我在WOW-ed中遇到的第一件事(在这个问题中也是如此 - /sf/answers/29034211/)是int foo(int)
(一个基本的阶乘函数)如何编译成一个紧凑的循环.这是它的ARM程序集:
.globl _foo
.align 2
.code 16
.thumb_func _foo
_foo:
mov r1, r0
movs r0, #1
cbz r1, LBB0_2
LBB0_1:
muls r0, r1, r0
subs r1, #1
bne LBB0_1
LBB0_2:
bx lr
Run Code Online (Sandbox Code Playgroud)
Blimey我想.这很有趣!完全紧密循环来做阶乘.哇.这不是尾调用优化,因为它不是尾调用.但它似乎做了类似的优化.
现在看看main
:
.globl _main
.align 2
.code 16
.thumb_func _main
_main:
movw r0, …
Run Code Online (Sandbox Code Playgroud)