该标准规定std::chrono::system_clock
如下:
23.17.7.1类SYSTEM_CLOCK [time.clock.system]类SYSTEM_CLOCK的
对象表示来自全系统的实时时钟挂钟时间。
这具有多重含义。首先,通过std::chrono::system_clock::to_time_t
和std::chrono::system_clock::from_time_t
可以将此时钟的时间点转换为time_t
或从time_t
转换为时间点,暗示时钟表示某种物理时间。其次,时钟被指定为“系统范围”,这意味着所有进程都应该从该时钟检索相同的time_point
值。
实际上,这意味着这个时钟通常是通过调用特定于操作系统的函数来实现的,这些函数可以检索某种时间,例如您可以在任务栏中看到的那样。
请注意,如果此时钟is_steady
未指定。这意味着从这个时钟的timepoints
不必总是前进。即使呼叫在实际时间稍后发生,您也可以获得较早的时间点。例如,如果用户通过某种操作系统设置调整了时钟,就会发生这种情况。
什么是更接近你所描述的是std::chrono::steady_clock
:
23.17.7.2类steady_clock [time.clock.steady]
类steady_clock的对象代表的时钟其time_point值不会减少随着物理时间的增加以及时间点相对于实时的稳定速率的增加。
我们提到了两个要求。首先,时钟必须是单调的,所以时间永远不会“倒退”。其次,时钟是稳定的,所以这个时钟的每个时钟都应该花费相同的物理时间。
用像循环计数器这样的硬件计数器来实现这个时钟感觉很自然。但要小心:这个时钟不一定是系统范围的。这是一个值,例如,从当前正在执行的CPU中获取,即使其他CPU可能具有不同的计数器。
您是否有特定的实现? – chris
@chris你能详细说明你的意思吗?你的意思是像x86一样的实现与arm还是代码实现? – Greg
最值得注意的是操作系统,因为计时库可能简单地委托给一个操作系统调用来获取自时代以来的系统时间。例如,Windows具有'GetSystemTime'。这个标准很少会对细节有直接的了解,因为它限制了什么样的系统可以实现它。 – chris