是否保证 std::chrono::steady_clock 永远不会回绕?
Is it guaranteed that std::chrono::steady_clock never wraps around?
基本上:
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()
?
就像这个主题领域中的许多事情一样,它很复杂...
是的,保证 steady_clock::now()
永远不会回绕,因为它保证它总是增加:
http://eel.is/c++draft/time.clock.steady
Objects of class steady_clock
represent clocks for which values of
time_point
never decrease as physical time advances and for which
values of time_point
advance at a steady rate relative to real
time. That is, the clock may not be adjusted.
但是...
how it this guaranteed
从技术上讲,不可能永远拥有一个具有有限内存滴答且永远不会 运行 超出范围的时钟。所以从技术上讲,答案是否定的。
但是...
作为一种实用的方式,steady_clock
的所有实现都使用带符号的 64 位整数类型计算 nanoseconds
。这个范围是+/- 292年。纪元通常是计算机上次启动的时间。所以实际上,它不会在你的一生中结束。因此,当它结束时,这将是其他人的问题,并且所涉及的计算机将因具有该时间长度的正常运行时间而获得某种奖励。
PS:我迫不及待地想看到计算机手册说:
Must be rebooted at least once every 292 years.
:-)
基本上:
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()
?
就像这个主题领域中的许多事情一样,它很复杂...
是的,保证 steady_clock::now()
永远不会回绕,因为它保证它总是增加:
http://eel.is/c++draft/time.clock.steady
Objects of class
steady_clock
represent clocks for which values oftime_point
never decrease as physical time advances and for which values oftime_point
advance at a steady rate relative to real time. That is, the clock may not be adjusted.
但是...
how it this guaranteed
从技术上讲,不可能永远拥有一个具有有限内存滴答且永远不会 运行 超出范围的时钟。所以从技术上讲,答案是否定的。
但是...
作为一种实用的方式,steady_clock
的所有实现都使用带符号的 64 位整数类型计算 nanoseconds
。这个范围是+/- 292年。纪元通常是计算机上次启动的时间。所以实际上,它不会在你的一生中结束。因此,当它结束时,这将是其他人的问题,并且所涉及的计算机将因具有该时间长度的正常运行时间而获得某种奖励。
PS:我迫不及待地想看到计算机手册说:
Must be rebooted at least once every 292 years.
:-)