繁体   English   中英

GCC迭代功能的优化

[英]GCC optimization of iterative functions

对于递归和迭代版本,我都有以下斐波那契代码:

#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

递归比迭代或尾递归版本(通常会优化为迭代版本)要慢。 两者的示例都在此线程中:

斐波那契计算时间

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

int sum = fib1 + fib2;
fib1 = fib2;
fib2 = sum;

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

您不会从long long iterative (long long i) return任何东西。 您应该在每个非void函数的末尾放置一个return语句,否则,您将得到UB(未定义的行为)。

但是,该功能可能仍会“返回”某些内容。 它会“返回”处理器寄存器中用于从函数返回值的所有结果,这可能就是您要return含义,可能不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM