我读到如果您的程序使用的最高分辨率类型是milliseconds
,而这种类型将覆盖您的值所在的整个范围,那么您应该坚持使用它,以避免到处都有duration_casts
。
相反,如果只需要seconds
的精度,则函数内将只有一个。
但是,对于函数的返回类型,相反地,您将返回可能的最低分辨率,以使duration_casts的数量最少(此处甚至是最佳性能,因为在这种情况下您仍然会进行转换)。
不幸的是,我没有找到一个全面(或实际上,以任何方式)涵盖此问题的资源。这是应该使用std::chrono
的方式吗(假设一个人不急于表现的最后可能)?
最佳答案
我认为,关于这种策略,一般人没有很多可以说的,除了可以,您不想用duration_cast
乱扔代码。仅为要截断精度的那些转换保留duration_cast
。在那种情况下,请注意duration_cast
会截断为零。 C++ 17引入了其他3种截断策略:
floor
:朝负无穷大截断ceil
:截断为正无穷大round
:截断至最接近的位置,甚至平移至领带(如果您使用的是C++ 11/14,则可以获取这些方便的实用程序here)。
当然,如果
milliseconds
是您要处理的最佳精度,那么将milliseconds
作为参数类型是一个不错的策略。对于某些应用程序,对返回类型使用较粗略的精度可能会很好,但对于所有应用程序可能并非如此。考虑:
seconds process(milliseconds input);
process
是一些函数,它接受duration
input
,对其执行一些操作,然后返回duration
输出。在本示例中,我选择的精度要比输入(seconds
)高。大概在某个时候,我已经截断了输入的精度,并且在此过程中丢失了信息。现在,如果
process
的目的是截断精度,那就完全可以了。但是,如果process
的目的还有其他用途,而您只是返回seconds
,以便客户端可以执行以下任一操作:milliseconds result1 = process(input);
seconds result2 = process(input);
那么您可能不会对客户有任何帮助。当然,获取
result2
的语法非常干净。但是,在截断的方向(向下,向上,最近等)上,您也没有选择此客户端。也许这对您的应用程序来说是一件好事。但这对所有人都不是一件好事,因此对于通用库也不是一件好事。再举一个例子,让我们看一看
<chrono>
本身的函数的返回类型:template<class Rep1, class Period1, class Rep2, class Period2>
constexpr
common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>>
operator+(const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
在此示例中,函数(
operator+
)从其输入返回最精确的精度,而不是最粗糙的精度,从而努力不丢失任何信息。如果需要,客户端可以自由截断该结果。对于那些不熟悉common_type_t
的人,这与以下内容一致:constexpr
milliseconds
operator+(const seconds& lhs, const milliseconds& rhs);
关于c++ - 我应该使用高分辨率时间类型作为参数来避免duration_casts吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62062123/