C++标准是否允许std::chrono时钟period大于分辨率且使用浮点表示
关于浮点表示、period大于实际分辨率的std::chrono时钟实现合规性解答
结论
这种实现符合C++标准的最低约束要求,但对period的定义存在解读歧义,实际生产环境中不推荐采用这类实现。
标准约束验证
C++标准N4860 §27.3表97 [time.clock.req]对时钟的rep和period仅明确了三条要求:
rep必须是算术类型或模拟算术类型的类:使用double作为rep属于原生浮点算术类型,完全满足要求。period必须是std::ratio的特化版本:示例中使用std::ratio<1, 1>完全符合要求。period是时钟以秒为单位的滴答周期:此处是歧义的核心来源。
歧义解读分析
对period为「滴答周期」的三种主流解读中,仅第一种延伸解读会判定这类实现不合规:
- 严格精度匹配解读(无标准依据):要求
time_since_epoch()返回的时间值转换为秒后除以period的余数必须为0,该规则仅在rep为整数类型时天然成立,标准从未要求duration::count()必须返回整数,因此该解读属于对标准的过度延伸,不具备约束效力。 - 亚滴答校正解读(符合真实硬件场景):
period仅代表时钟硬件原生的滴答触发间隔,允许通过校正值上报亚period精度的时间,这类场景在高精度授时领域非常常见,比如GPS秒脉冲时钟的触发间隔为1秒(对应period为ratio<1,1>),但通过误差校正可实现纳秒级的上报精度,浮点rep正好用来承载这类亚滴答的精度信息。 - 纯单位换算解读(最宽松合规):
period仅作为duration转秒数的单位换算系数,和时钟的实际精度、滴答间隔没有任何绑定关系,这种逻辑和Python中time.time()返回秒级单位浮点数、实际精度远高于1秒的实现完全一致,按该解读示例的时钟实现完全合规。
代码验证说明
你给出的测试代码:
const auto t = std::chrono::high_resolution_clock::now(); modf(t.time_since_epoch().count(), &dummy) != 0;
在上述浮点时钟实现下返回true是完全正常的行为,不违反标准要求。
注意:主流标准库(libstdc++、libc++、MSVC STL)实现的标准时钟均采用整数类型的
rep,避免引发通用chrono工具的兼容性问题,因此在主流环境下上述代码固定返回false。
内容的提问来源于stack exchange,提问作者TrentP
相关产品推荐
相关产品推荐

