提问人:dmedine 提问时间:7/24/2023 最后编辑:dmedine 更新时间:7/24/2023 访问量:167
为什么 steady_clock::now().time_since_epoch().count() 在 Windows 上返回自重新启动以来的时间?
why does steady_clock::now().time_since_epoch().count() return time since reboot on Windows?
问:
Windows 10 上的以下代码:
#include <chrono>
#include <iostream>
int main(void)
{
const auto p1 = std::chrono::system_clock::now();
const auto p2 = std::chrono::steady_clock::now();
std::cout << "system_clock seconds since epoch: "
<< std::chrono::duration_cast<std::chrono::seconds>(
p1.time_since_epoch()).count()
<< '\n';
std::cout << "steady_clock seconds since epoch: "
<< std::chrono::duration_cast<std::chrono::seconds>(
p2.time_since_epoch()).count()
<< '\n';
return 0;
}
输出:
system_clock seconds since epoch: 1690157550
steady_clock seconds since epoch: 434342
所以似乎计算了自上次启动以来的时间---即使我要求自 Epoch 以来的时间。对我来说,这是不正确的。自纪元以来,它没有给我时间。steady_clock
答:
C++ 标准没有对所有时钟的纪元进行任何具体定义,作为一般要求:
27.3 Cpp17时钟要求 [time.clock.req]
1时钟是由持续时间、time_point和 函数 now() 来获取currenttime_point。时钟的起源 time_point被称为时钟的纪元。
句点。一个特定的时钟有某种起源纪元,但它是什么,一般没有指定。它是为每个特定时钟指定的(如果有)。
例如,的原产地明确给出为 1970 年 1 月 1 日:system_clock
类 system_clock [time.clock.system]
[ ... ] system_clock类型的对象表示系统范围实时时钟的挂钟时间。sys_time类型的对象测量自 1970-01-01 00:00:00 UTC 以来的时间,不包括闰秒。
没有这样的要求。C++ 标准保留 未指定 的原点或纪元。给你的唯一保证是永远不会减少。从 C++ 标准:steady_clock
steady_clock
steady_clock
类 steady_clock [time.clock.steady]
[...]
类 steady_clock 的对象表示时钟,其值 time_point永远不会随着物理时间的推进和价值而减少 time_point相对于实时以稳定的速度前进。那是 时钟可能无法调整。
就是这样。没有表示与挂钟时间和任何特定的基于挂钟的起点有任何关系。因此,MS-Windows 自系统启动以来计算时间的实现在此定义的范围内。steady_clock
现在,时钟确实会在下一次启动时有效地重置自己,可以问一个问题,这是否严格符合“永不减少”的要求,但那将是一个不同的问题。到目前为止,为什么不计算秒数,因为Unix纪元,就像,是因为C++标准不需要这个。steady_clock
system_clock
评论
steady_clock
system_clock
steady_clock
utc_clock
steady_clock
system_clock
steady_clock
评论
time_since_epoch
steady_clock
的 POSIX 模拟在类 Linux 系统和基于 FreeBSD 的嵌入式操作系统上工作相同,我遇到过计算进程启动以来时间的情况。它的目的是具有永不回退的计时器(即使系统时间可能由于某种原因而回滚,例如由于 NTP 服务的更正)