使用std::chrono进行时间单位隐式转换的标准方法及疑问
std::chrono时间单位转换的常用方法及无损转换的注意事项
一、常用的时间单位转换方法
针对毫秒转纳秒这类场景,常用方法主要有以下几种:
显式使用
std::chrono::duration_cast(最标准的显式转换方式)
这是C++标准规定的显式转换duration的通用方法,无论转换是否无损都能使用,代码意图清晰,适合需要明确转换逻辑的场景:constexpr uint64_t foo_ns = std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::milliseconds(500)).count();利用duration的算术运算获取转换比例
通过将源duration除以1个目标单位的duration,得到单位间的倍数数值,本质是计算比例关系:// 方法1:直接构造duration对象计算 constexpr uint64_t foo_ns = std::chrono::milliseconds(500) / std::chrono::nanoseconds(1); // 方法2:使用chrono字面量(C++14及以上支持),代码更简洁 using namespace std::chrono_literals; constexpr uint64_t foo_ns = 500ms / 1ns;注意:这种方式得到的是纯数值结果,不是duration对象,适合直接需要数值的场景。
隐式转换(仅适用于无损转换场景)
对于毫秒转纳秒这类无损转换(源单位周期是目标单位的整数倍,且转换后数值不会超出目标类型范围),可以直接隐式转换,无需额外操作:constexpr std::chrono::nanoseconds ns_ms = std::chrono::milliseconds(500); constexpr uint64_t foo_ns = ns_ms.count();
二、无损转换场景下是否必须用duration_cast?
不需要。
C++标准规定,当std::chrono::duration的转换是无损的(即源周期到目标周期的转换因子为整数,且转换后数值不会超出目标类型的存储范围),编译器允许隐式转换。比如毫秒转纳秒,1毫秒=1000000纳秒,是整数倍,且对于64位无符号整数来说不会溢出,因此可以直接赋值,无需duration_cast。
只有当转换是有损的(比如纳秒转毫秒,会丢弃小数部分),或者编译器无法确定转换是否无损时,才必须使用duration_cast来显式声明你接受精度损失的意图,否则编译器会报错。
内容的提问来源于stack exchange,提问作者Matt Stokes
相关产品推荐
相关产品推荐

