c++ - `rep` 时钟中的有符号和无符号 `std::chrono`

标签 c++ std c++-chrono

std::chrono::system_clockrep 类型必须是有符号算术类型,而 steady_clock high_resolution_clock(和自定义时钟类型)不需要具有签名的 rep 类型。

这种区别的基本原理是什么?使用无符号 rep 类型的时钟会产生什么后果?

最佳答案

这样做的理由是让供应商在 steady_clock 上有更多的自由。和 high_resolution_clock .事后看来,这种自由并不是必需的,因为迄今为止所有的实现都使用带符号的整数类型。

使用未签名的 rep 的后果在这些时钟中是他们的 duration嵌套类型不会是六个“预定义”持续时间之一:

nanoseconds
microseconds
milliseconds
seconds
minutes
hours

因为这些都是需要签名的。还有使用未签名 rep 的时钟的客户端必须小心减去 time_point来自那个时钟的 s:减去 t0 - t1什么时候t0 < t1会导致无符号溢出值:定义明确,但可能出乎意料。

这样的时钟可以安全使用,并且确实存在无符号溢出的用例。但一般来说它可能更容易出错。

此纬度未扩展到 system_clock 的原因是希望system_clock会跟踪 Unix Time ,我想要求 1970-01-01 00:00:00 UTC 之前的日期时间在 system_clock::time_point 中表示. system_clock是与人类日历相关的唯一时钟。

在 C++20 规范草案中,Unix Time最终会指定关系,system_clock::time_point之间的转换会容易得多和民用日历,包括 1970-01-01 00:00:00 UTC 之前的日期时间。

但是steady_clock仍然是一个“秒表”:非常适合计时,但与人类日历没有任何关系。

关于c++ - `rep` 时钟中的有符号和无符号 `std::chrono`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52495777/

相关文章:

c++ - 将两个复杂属性重组为新对象

c++ - std::_lockit 做什么?

c++ - 如何从 std::integer_sequence 初始化静态数组?

c++ - 如何让自定义(计时)计时器与 sleep_until 一起工作?

c++ - 我想知道为什么用 vector 可以成功而用数组却不行?

c++ - WPF 可以与 C++ 一起使用吗?

c++ - 我得到一个没有被忽略的无效值,因为它应该是错误的,为什么?

c++ - 自定义池分配器 std::list

c++ - C++ 中 PRNG 的默认随机引擎为类的每个实例生成相同的输出 - 正确的种子?

c++ - C++ 获取一天开始时间戳