[英]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 && ./fib
: Result: 0
gcc fibonacci.c -o fib && ./fib
: Result: 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.