panzerQ
光坂国中生
光坂国中生
  • 注册日期2026-03-15
  • 最后登录2026-04-07
  • 生日2004-1-1
  • 光玉10颗
阅读:18回复:0

阻止过于激进的死代码消除

楼主#
更多 发布于:2026-04-07 17:14
你写了一段C++代码,希望测试CPU的能耐:

int Main() {
   clock_t start, end;
   long long N = 1 << 20;
   int repeat_time = 100;
   float_type *data = new float_type[N];
   double max_duration = 0.0;
   double sum_duration = 0.0;

   std::random_device rd;
   std::mt19937 gen(rd());
   std::uniform_real_distribution<float_type> dis(0.0, 300000.0);

   for (int time = 0; time < repeat_time; time++) {
       for (size_t i = 0; i < N; ++i) {
           data = dis(gen);
       }

       float_type max_element = -INFINITY;
       float_type sum = 0.0;

       start = clock();
       for (int i = 0; i < N; i++)
           if (max_element < data) {

               max_element = data;

           }
       end = clock();
       max_duration += (double) (end - start) / CLOCKS_PER_SEC;

       start = clock();
       for (int i = 0; i < N; i++)
           sum += data;

       end = clock();
       sum_duration += (double) (end - start) / CLOCKS_PER_SEC;
       if (sum < max_element)
           std::cout << "This is to prevent dead code.\n";

   }

   std::cout << "N = " << N << "\n";
   std::cout << "Avg Time Cost Of VecSum: "
             << sum_duration / repeat_time << " s\n";

   std::cout << "Avg Time Cost Of VecMax: "
             << max_duration / repeat_time << " s\n";

   return 0;
}


那段标红的 If 语句看起来很奇怪,但如果把它注释掉,
版本稍高的
g++ 在开启 O3 就会认为 max_elementsum 从未使用,
进而把两个 for 循环也忽略,计时结果也就一直都是0了。

优雅一些的做法是使用 volatile 关键字标记 summax_element
也可以避免过于激进的死代码消除,得到你想要的计时结果。

关于 volatile 关键字,可以阅读下面的文档:
volatile type qualifier - cppreference.com
喜欢0 评分0
游客

返回顶部