前几天我遇到了一个使用GCC和'-Ofast'优化标志的奇怪问题.使用'gcc -Ofast -o fib1 fib1.c'编译以下程序.
#includeint f1(int n) { if (n < 2) { return n; } int a, b; a = f1(n - 1); b = f1(n - 2); return a + b; } int main(){ printf("%d", f1(40)); }
在测量执行时间时,结果是:
peter@host ~ $ time ./fib1 102334155 real 0m0.511s user 0m0.510s sys 0m0.000s
现在让我们在程序中引入一个全局变量,然后使用'gcc -Ofast -o fib2 fib2.c'再次编译.
#includeint global; int f1(int n) { if (n < 2) { return n; } int a, b; a = f1(n - 1); b = f1(n - 2); global = 0; return a + b; } int main(){ printf("%d", f1(40)); }
现在执行时间是:
peter@host ~ $ time ./fib2 102334155 real 0m0.265s user 0m0.265s sys 0m0.000s
新的全局变量没有任何意义.但是,执行时间的差异很大.
除了问题(1)这种行为的原因是什么,如果(2)在不引入无意义的变量的情况下可以实现最后的表现,那也是很好的.有什么建议?
谢谢彼得