C 语言中的死编码



我使用编译器的不同选项(O0 O1 O2 O3 Os)分析以下代码。第一次迭代是"预热缓存"的循环。对于 O0 和 O1,衰减时间不同,0.00 越高,因为输入参数(N 和 ITER)越大。

当我使用 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,"%lfn",tiempo);
  printf("%lft",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. 查看来自不同优化级别的结果程序集。

相关内容

  • 没有找到相关文章

最新更新