对于嵌入式项目,我想使用std::chrono::seconds
来表示超时值,尤其是出于类型性的原因。这要求std::chrono::seconds
可以从unsigned int类型快速构造,并且传递值必须非常快。是这样的吗?
答案 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 == 1
和CF::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更可信,并且声明:
表示存储刻度计数。这是唯一的计数 存储在持续时间
中的数据成员
听起来很不错,如果性能很重要,请分析您的代码。如果没关系,这个问题毫无意义。
旧答案......
持续时间中存储的唯一数据是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;
};