【问题标题】:std::chrono::system_clock vs std::chrono::high_resolution_clock behaviorstd::chrono::system_clock 与 std::chrono::high_resolution_clock 行为
【发布时间】:2017-09-02 18:05:52
【问题描述】:

考虑以下代码sn-p:

#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,计数的差异是数十亿秒的数量级。这怎么可能?

【问题讨论】:

  • 代码,如图所示,无法编译。
  • 你需要包含
  • 您的代码无效有效的演员阵容:std::chrono::duration_cast&lt; std::chrono::seconds &gt;( your-time )
  • gcc 6.2.0 没有错误,两者都是一样的
  • 在创建 code compile 之后,我在 g++ 中得到了相同的结果,但在 MSVS 2017 中我得到了 1806453 vs 1491565092

标签: c++ c++11 chrono


【解决方案1】:

它为您断言的原因是因为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 的时代是计算机启动的时候。

Here is a video tutorial for &lt;chrono&gt;.它涵盖了很多问题,包括这个,大约一个小时。


1system_clock has been made official for C++20 的事实标准。

system_­clock 类型的对象表示从 系统范围的实时时钟。 sys_­time&lt;Duration&gt; 类型的对象 测量自 1970-01-01 00:00:00 UTC 以来的时间,不包括闰秒。 此度量通常称为Unix time。这项措施 促进sys_­time 和日历之间的有效映射 类型([time.cal])。 [ 例子: sys_­seconds{sys_­days{1970y/January/1}}.time_­since_­epoch()0s.
sys_­seconds{sys_­days{2000y/January/1}}.time_­since_­epoch()946'684'800s,也就是10'957 * 86'400s——结束示例 ]

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2017-08-31
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多