C中的死编码

Dead coding in C

我使用不同的编译器选项分析以下代码 (O0 O1 O2 O3 Os)。第一个迭代在 "warming the cache" 的循环之外。对于 O0 和 O1,随着输入参数(N 和 ITER)越大,射出时间不同,0.00 越高。

当我使用 O2、O3 和 Os 选项时,问题就来了。射出时间为 0.000。我已阅读,可能是死代码检测。可能吗?为什么会这样?

  for(i=0; i<N; i++){
    a = i * 128;
    b = a / 32;
  }

  gettimeofday(&inicio, NULL);

  for(j=0; j<ITER; j++)
   for(i=0; i<N; i++){
     a = i * 128;
     b = a / 32;
   }

  gettimeofday(&final, NULL);

  tiempo = (final.tv_sec-inicio.tv_sec + (final.tv_usec-inicio.tv_usec)/1.e6);
  fprintf(fp,"%lf\n",tiempo);
  printf("%lf\t",tiempo);

  for(i=0; i<N; i++){
     a = i << 7;
     b = a >> 5;
   }

  gettimeofday(&inicio, NULL);

  for(j=0; j<ITER; j++)
   for(i=0; i<N; i++){
     a = i << 7;
     b = a >> 5;
   }

有人能帮帮我吗? 谢谢

由于计算中涉及的变量不会在循环外访问,因此编译器完全删除代码我不会感到惊讶。

两种简单的检查方法:

  1. ab 声明为 volatile
  2. 从不同的优化级别看一下生成的程序集。