c++ - 我应该使用高分辨率时间类型作为参数来避免duration_casts吗?

标签 c++ type-conversion implicit-conversion chrono

我读到如果您的程序使用的最高分辨率类型是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/

    相关文章:

    c++ - POSIX pthread 多次使用同一个线程

    scala - 在 Scala 中将 List[Short] 转换为 Array[Byte] 的最佳方法是什么?

    xml - 在 Powershell 中将 xml 转换为 csv 文件

    mysql - 从 double 据类型转换为十进制

    c++ - 模板类中的模板转换运算符-函数指针

    c++ - 在存在通用构造函数的情况下,三元运算符上的 SFINAE 失败

    C++ 逐行读取文本,需要节省速度/效率

    c++ - 如何在 vc 2008 或 vc 2010 Beta 中将对话框栏或对话框放入 Pane

    .net - 如何判断类型 A 是否可隐式转换为类型 B

    c++ - 传递整数文字时没有隐式转换警告?