是std :: chrono :: seconds轻量级?

时间:2014-02-07 11:11:04

标签: c++ c++11

对于嵌入式项目,我想使用std::chrono::seconds来表示超时值,尤其是出于类型性的原因。这要求std::chrono::seconds可以从unsigned int类型快速构造,并且传递值必须非常快。是这样的吗?

2 个答案:

答案 0 :(得分:10)

更新。似乎我有时会费心去检查标准。

这是标准关于持续时间的复制构造的说法。

20.11.5.1 持续时间构造者

template <class Rep2, class Period2>
constexpr duration(const duration<Rep2, Period2>& d);
  

效果:构造一个duration类型的对象,从

构建rep_
duration_cast<duration>(d).count()

20.11.5.7 duration_cast

template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep, Period>& d);
  

2返回:让CF为

ratio_divide<Period, typename ToDuration::period>
  

- 如果CF::num == 1CF::den == 1,则返回

ToDuration(static_cast<typename ToDuration::rep>(d.count()))

20.11.5.2持续时间观察员

  

constexpr rep count()const; 1返回:rep _。

从这一切开始,除非我弄错了,复制构造函数应该从原始的static,static将它转换为新的rep类型(在这种情况下是相同的)并使用rep构造函数构造新的duration对象。至少,实际上。如果实现除此之外还要做一些非常重的事情,请考虑将其丢弃。

不幸的是,我找不到标准中成员数据的限制,但Howard Hinnant链接的document可能比cppreference.com更可信,并且声明:

  

表示存储刻度计数。这是唯一的计数   存储在持续时间

中的数据成员

听起来很不错,如果性能很重要,请分析您的代码。如果没关系,这个问题毫无意义。

旧答案......

根据cppreference.com

  

持续时间中存储的唯一数据是Rep。

类型的滴答计数

所以,是的,价值传递似乎很快。正如我在评论中所建议的那样,std::chrono::duration<unsigned int>应该稍微提高效率,只要原始unsigned int没有溢出,您就不必担心溢出。

答案 1 :(得分:4)

以下是seconds的可能部分实现,它可能比直接使用整数更慢。

template <typename T>
struct duration<T, ratio<1>> {
    using rep = T;
    using period = ratio<1>;

    duration(T r) : r(r) { this_thread::sleep_for(hours(1)); }

private:
    T r;
};