【问题标题】:Is it guaranteed that std::chrono::steady_clock never wraps around?是否保证 std::chrono::steady_clock 永远不会环绕?
【发布时间】:2020-10-07 21:49:58
【问题描述】:

基本上:

auto p1 = std::steady_clock::now().time_since_epoch().count();

... // do smth for unspecified period of time

auto p2 = std::steady_clock::now().time_since_epoch().count();

assert(p2 >= p1);   // is this guaranteed?

?

如果是——这是如何保证的?通过确保没有任何 C++ 程序运行时间超过 std::steady_clock::duration::max() - std::steady_clock::duration::zero()?

【问题讨论】:

    标签: c++ c++11 chrono


    【解决方案1】:

    就像这个主题领域的许多事情一样,它很复杂......

    是的,保证steady_clock::now() 永远不会换行,因为它保证它总是增加:

    http://eel.is/c++draft/time.clock.steady

    steady_­clock 类的对象表示时钟,其值为 time_­point 永远不会随着物理时间的推移而减少 time_­point 的值相对于实际值以稳定的速度前进 时间。也就是说,时钟可能无法调整。

    但是……

    这是如何保证的

    从技术上讲,不可能有一个具有有限内存滴答的时钟永远不会超出范围。所以从技术上讲,答案是否定的。

    但是……

    作为一种实用的方式,steady_clock 的所有实现都使用带符号的 64 位整数类型计算 nanoseconds。这个范围是 +/-292 年。 epoch 通常是您的计算机最后一次启动。所以实际上,它不会在你的一生中结束。因此,当它结束时,这将是其他人的问题,并且所涉及的计算机将因正常运行时间达到该时间长度而获得某种奖励。

    PS:我等不及电脑手册出来了:

    必须至少每 292 年重新启动一次。

    :-)

    【讨论】:

    • 640K 对于任何人来说都应该足够了。或者这样的规范引用是什么?
    • 经典!但是为了历史准确性,快速编辑到 640Kb... :-)
    • 我想可以安全地假设GetTickCount()(或类似的)从未用于实现steady_clock,否则操作系统会不时杀死我的应用程序。
    • GetTickCount() 将是一个符合要求的实现。但是毫秒级的分辨率会令人失望。 Visual Studio steady_clock::duration 是 nanoseconds。
    • 完成。虽然这是杜撰的 afaik
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多