在计算一段代码时,我是否需要易失性?

Wal*_*ter 5 c++ timing volatile

我想自动调整我的代码,因此必须测量某些代码段所需的时间

auto t0 = std::chrono::high_resolution_clock::now();
section_of_code_to_be_timed(arguments);
auto dt = std::chrono::duration_cast<std::chrono::nanoseconds>
         (std::chrono::high_resolution_clock::now()-t0).counts();
// ... using dt to tweak auto-tuning parameters
Run Code Online (Sandbox Code Playgroud)

我担心的是,编译器可能会重新安排的呼吁std::chrono::high_resolution_clock::now()section_of_code_to_be_timed(),因此无效我定时测量.这是一个有效的担心吗?如果是这样,我可以通过声明t0 volatile或其他方式(如何)来阻止它吗?

(我注意到我可以使用RAII成语,类似于std::lock_guard,似乎没有用volatile...)

Jam*_*nze 5

形式上,还是实际上?形式上,对的调用 std::chrono::high_resolution_clock::now()不是可观察的行为,因此编译器可以按照自己想要的方式重新排列它们。实际上,编译器会将它们视为可观察的行为,因此在这方面您不会遇到任何问题。另一方面,你最好做一些事情来确保 section_of_code_to_be_timed确实有所作为。(我经常将其设置为类的虚拟成员,这会引入足够的间接性来欺骗大多数编译器。并且在函数本身中,我确保它生成的结果在函数外部可见。)

请注意,无论哪种方式,volatile都是无关紧要的。它所确保的只是 和 是以t0正确dt的顺序编写的(实际上,它通常不能确保这一点);它不section_of_code_to_be_timedt0或做出任何保证dt