当我正常使用x86机器中的GCC编译器编译下面提到的代码片段时,我得到的预期输出 120 。
但是,只要我使用-O3
标志编译这个确切的代码段,输出就会变为 0 ,这是不可取的。
/* CODE SNIPPET FOR GENERAL RECURSION */
#include<stdio.h>
int add(int n);
int main()
{
int n=15;
printf("Sum of all the 15 numbers in recursion = %d \n",add(n));
return 0;
}
int add(int n)
{
if(n!=0)
{
printf( "N Value = %d \n",n);
return (n+add(n-1)); /* recursive call */
}
}
任何人都可以告诉我GCC编译器如何使用此-O3标志生成模糊结果?什么样的优化-O3在做什么?
要编译的命令:
gcc testrecursion1.c -o recursion1 # (EXPECTED OUTPUT)
gcc -O3 testrecursion1.c -o recursionO3 # (AMBIGUOUS OUTPUT)
答案 0 :(得分:0)
默认情况下,GCC使用-O0(减去零),这意味着根本不进行优化&#34;。
然后,只要启用优化,编译器就会大量优化,并且在这种特殊情况下,将add
函数专门用于提供的输入。对[{1}}的最后一次调用将针对add
,因此您最终会使用该版本。
为避免这种情况发生,请不要在程序中硬编码n=0
,而是将其作为程序的参数(以便编译器不知道{{1}的值可以传入,因此无法专门化这些值的代码。)
例如:
n=15
然后运行:n