使用-O3标志编译演示递归代码时的异常行为

时间:2016-05-25 13:41:35

标签: gcc compilation compiler-errors

当我正常使用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 */
      }
}
  • 预期输出= 120

任何人都可以告诉我GCC编译器如何使用此-O3标志生成模糊结果?什么样的优化-O3在做什么?

要编译的命令:

gcc     testrecursion1.c -o recursion1  # (EXPECTED OUTPUT)
gcc -O3 testrecursion1.c -o recursionO3 # (AMBIGUOUS OUTPUT)

1 个答案:

答案 0 :(得分:0)

默认情况下,GCC使用-O0(减去零),这意味着根本不进行优化&#34;。

然后,只要启用优化,编译器就会大量优化,并且在这种特殊情况下,将add函数专门用于提供的输入。对[{1}}的最后一次调用将针对add,因此您最终会使用该版本。

为避免这种情况发生,请不要在程序中硬编码n=0,而是将其作为程序的参数(以便编译器不知道{{1}的值可以传入,因此无法专门化这些值的代码。)

例如:

n=15

然后运行:n