std::chrono::system_clock和std::chrono::high_resolution_clock行为的区别

4

考虑下面的代码片段:

#include <chrono>
#include <cassert>

int main()
{
     auto result1 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::high_resolution_clock::now().time_since_epoch());
     auto result2 = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch());
     assert((result2.count() - result1.count()) < 10);
}

我期望两个值之间的差异应该是最小的(理想情况下少于一秒)。但是在使用VS2015时,这个计数的差异是以亿计秒为单位的。这怎么可能呢?


1
代码如所示,无法编译。 - G.M.
你需要包含 <chrono> 和 <cassert>。 - Arun
您的代码无效。一个有效的强制转换是:std::chrono:: duration_cast<std::chrono::seconds>(your-time) - Shakiba Moshiri
使用gcc 6.2.0时没有错误,两者完全相同。 - Shakiba Moshiri
编译代码后,我在g++中得到了相同的结果,但在MSVS 2017中得到了“1806453”与“1491565092”的不同结果。 - NathanOliver
很可能这是一个 MSVS 的 bug。真是个震惊 - NathanOliver
1个回答

12

这个断言会触发是因为 high_resolution_clock 允许(并且通常)有一个不同于 system_clock 的时代。

system_clock 是默认标准(未指定但可移植),它的时代是从 1970-01-01 00:00:00 UTC 开始测量时间,忽略闰秒。1

high_resolution_clock 没有默认标准。在 gcc 上,high_resolution_clocksystem_clock 的 typedef,因此在 gcc 平台上,您会注意到完美的同步。在 VS 和 libc++ 中,high_resolution_clocksteady_clock 的 typedef。

对于我来说,steady_clock 的时代是计算机启动时。

这里有一个关于 <chrono> 的视频教程,涵盖了很多问题,包括本问题,视频长度约为一小时。


1C++20 已正式确定了 system_clock 的默认标准

system_­clock 类型的对象表示系统范围内的实时钟表时间。类型为 sys_­time<Duration> 的对象测量自 1970-01-01 00:00:00 UTC 起的时间,不包括闰秒。这个度量通常称为 Unix 时间。 这个度量能够有效地映射到日历类型([time.cal])。[例子:sys_seconds{sys_days{1970y/January/1}}.time_since_epoch()0秒sys_seconds{sys_days{2000y/January/1}}.time_since_epoch()946'684'800秒,即 10'957 * 86'400秒


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接