相关疑难解决方法(0)

编译器如何很好地优化这个阶乘函数?

所以我一直在看一下O3GCC 中的一些魔法(实际上我正在使用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)

gcc clang compiler-optimization

14
推荐指数
1
解决办法
820
查看次数

标签 统计

clang ×1

compiler-optimization ×1

gcc ×1