编译器可以通过调用std :: chrono :: system_clock :: now()来重新排序代码吗?

NoS*_*tAl 6 optimization visual-studio c++11 c++-chrono

在玩VS11测试版的时候,我注意到了一些奇怪的东西:这个代码couts

f耗时0毫秒

int main()
{
    std::vector<int> v;
    size_t length =64*1024*1024;
    for (int i = 0; i < length; i++)
    {
        v.push_back(rand());
    }

    uint64_t sum=0;
    auto t1 = std::chrono::system_clock::now();
    for (size_t i=0;i<v.size();++i)
        sum+=v[i];
    //std::cout << sum << std::endl;
    auto t2 = std::chrono::system_clock::now();
    std::cout << "f() took "
        << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
              << " milliseconds\n";


}
Run Code Online (Sandbox Code Playgroud)

但是,当我决定取消注释总和时,它打印出一个合理的数字.

这是我启用优化后的行为,禁用它们我得到"正常"cout

f()花了471毫秒

这个符合标准的行为是什么?重要提示:不是死代码被优化掉了,我可以看到从控制台运行时的滞后,我可以看到任务管理器中的CPU峰值.

Jon*_*eet 10

我的猜测是这死代码优化 - 并且你的负载峰值是由于初始化向量的工作没有被优化掉,但你未使用的sum变量的计算.

但是,当我决定取消注释总和时,它打印出一个合理的数字.

这与我的理论一致,是的 - 当你被迫使用计算结果时,计算本身无法被优化掉.

如果你想进一步确认,让你的程序在准备就绪时说出来并暂停按下返回 - 这样你就可以等到任何CPU峰值在你按回车之前明显"消失",这会让你更有信心关于是什么导致它.