GCC优化迭代函数

时间:2015-04-25 16:08:04

标签: c gcc optimization

对于递归和迭代版本,我有以下Fibonacci代码:

#include <stdio.h>

typedef long long INT;

long long recursive (long long i) {
    if (i == 0) return 0;
    if (i == 1) return 1;
    return recursive (i-1) + recursive (i-2);
}


long long iterative (long long i) {
    INT counter = i-1;
    INT fib1 = 0;
    INT fib2 = 0;

    // first iteration
    fib1 = 0;
    fib2 = 1;

    while (counter > 0) {
        INT temp1 = fib1;
        INT temp2 = fib2;
        fib1 = fib2;
        fib2 = temp1 + temp2;

        counter--;
    }

}

int main (int argc, char **argv) {

    printf("Result: %lli\n", iterative(10));

    return 0;
}

我尝试使用GCC -O2优化来编译它,看看递归是否会比迭代更好,但我注意到一个有趣的事情:当用-O2编译时,迭代函数输出0而如果它被编译没有标志,它输出正确的数字。

gcc -O2 fibonacci.c -o fib && ./fibResult: 0

gcc fibonacci.c -o fib && ./fibResult: 55

3 个答案:

答案 0 :(得分:0)

递归将比迭代或尾递归版本慢(通常会针对迭代版本进行优化)。两者的例子都在这个帖子中:

Fibonacci Computation Time

答案 1 :(得分:0)

您的迭代循环也不是最理想的,它使用的分配比需要的多。这就够了:

-0.6;

当然,您可以在开始时为fib1 / fib2分配初始值,而不是先将初始值初始化为0,然后再分配。

答案 2 :(得分:0)

您不是return来自long long iterative (long long i)的任何内容。您应该在每个非return函数的末尾放置一个void语句,否则,您将获得UB(未定义的行为)。

然而,该功能可能仍然“返回”某些东西。它将“返回”处理器寄存器中用于返回函数值的任何内容,这可能是您对return的含义,可能不是。