gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:02:14 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com