c - GCC 迭代函数优化

标签 c gcc optimization

我有以下递归和迭代版本的斐波那契代码:

#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 && ./fib: 结果:0

gcc fibonacci.c -o fib && ./fib: 结果:55

最佳答案

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

Fibonacci Computation Time

关于c - GCC 迭代函数优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29867577/

相关文章:

c - NASM 在 C 中无法正确运行

c++ - 在 Mac 上将 GCC 4.4 与 NetBeans 集成

memory - Unity 分析我的脚本的内存使用情况

python - 在 list.extend 中删除这个不需要的副本

performance - 点乘积性能与 SSE 指令

c - 我想将一个函数拆分成两个函数

在此系统上找不到合适的 C 编译器,使

c - 生成文件结构

linux - 如何在 Linux 系统上安全地重新配置 gcc?

c - 使用 gcc 在 32 位模式下原子读/写 64 位值