【问题标题】:std::chrono calculate the difference in different ratiostd::chrono 计算不同比率的差异
【发布时间】:2016-07-25 17:21:50
【问题描述】:

我的标题可能不是很有帮助,我有一个 std::chrono::nanosecond,但我被要求序列化并提供第二个,然后是纳秒作为 JSON 中的不同值。

所以虽然我的结构成立:

struct time
{
     ...
     std::chrono::nanoseconds timepoint;
};

当被问到几秒钟时,我愿意

uint32_t sec() const
{
     return std::chrono::duration_cast<std::chrono::seconds>(timepoint_).count();
}

然而,当被问及纳秒时,我想要以纳秒为单位的分辨率,但没有秒(只有最不重要的值?)但是,以纳秒为单位的转换会返回秒和更高分辨率。

uint64_t nanosec() const
{
    return std::chrono::duration_cast<std::chrono::nanoseconds>(timepoint_).count();
}

如何计算实际增加的分辨率(例如,没有实际秒数的纳秒)?

【问题讨论】:

  • 尝试先取秒时间点(调用.count()之前的演员表结果),然后从实际时间点中减去它。结果时间点应该只有“剩余”纳秒。
  • 修改 10 亿个就够了吗?
  • @Xarn 我有点困惑,你能举个例子吗?

标签: c++


【解决方案1】:

您可以使用std::duration_caststd::seconds 检索秒数,使用模运算符检索纳秒数:

template <typename T>
std::pair<T, T> split (std::chrono::duration<T, std::nano> const& duration) {
    using seconds = std::chrono::duration<T>;
    return {std::chrono::duration_cast<seconds>(duration).count(),
            (duration % seconds{1}).count()};
}

this page 上有一个很好的例子,展示了在 std::chrono::duration 上使用算术运算符来实现你想要的。

【讨论】:

  • Modulo 在chrono::duration 上工作正常吗?将来会使用它。
  • @Xarn 它是由标准定义的,所以我认为它可以正常工作(这是直接对两个 std::chrono::duration 取模)。
  • 非常感谢这个例子。出于好奇,您使用modulo 并将纳秒持续时间划分为秒并拆分余数?
  • @Ælex 我使用强制转换除以 seconds 并使用模数计算余数。
【解决方案2】:

用户@Xarn 提供了解决方案:

auto sec = std::chrono::duration_cast<std::chrono::seconds>(tp);
auto nsec = std::chrono::duration_cast<std::chrono::nanoseconds>(tp);
auto diff = std::chrono::duration_cast<std::chrono::nanoseconds>(nsec - sec).count();

保留纳秒分辨率,不带秒数。

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多