贴一个解释得相对详细的帖子

https://renyili.org/post/std_chrono/

chrono里面用到了比较多的库里自定义的概念,我写一下学习笔记如下。

库里定义了三种时间相关的模板类

1. time_point

第一种表示使用某个计时时钟类型来记录的时间点

template<class Clock, class Duration = typename Clock::duration> 
class time_point;

第一个模板参数是问你用的起始计时时钟是什么类型(用该时钟记录天地初开之混沌原初时刻)
第二个模板参数是用什么类型记录“原初起始”到该时刻的时间间隔(实际使用时不提供这个参数,默认是跟随第一个参数保持一致的时钟类型)

混沌原初+时间间隔=这个时刻点

用法如下
其中第一个模板参数class Clock 库里提供了3种:
1) system_clock
2) steady_clock
3) high_resolution_clock

一个用法示例

std::chrono::time_point<std::chrono::steady_clock> base_tp;
base_tp = std::chrono::steady_clock::now();

std::chrono::time_point<std::chrono::system_clock> base_tp2
base_tp2 = std::chrono::system_clock::now();

2. Duaration

// Rep表示单位的数量单位
// Period表示单位
template<class Rep,  class Period = std::ratio<1>> class duration;

time_point的第二个模板参数类也是由两个模板类作为参数初始化

一是 Rep,指用于存储时间间隔的类型,比如32位int 64位double等等。比如如果用太小存储类型存存纳秒就可能会超,要考虑这一点。

二是 Period 时间单位,提示你告诉它单位是秒?毫秒?纳秒?还是其他?
但是表示的使用std::ratio的方式,std::ratio也提供两个模板参,第一个是分子,第二个是分母(默认为1可以不写)。

  • 比如std::ratio<1,1> 相当于 std::ratio<1> 表示的含义是 1/1 秒
  • 如果表示的单位是毫秒,就要用 std::ratio<1,1000> 表示 1/1000秒 = 毫秒

如果有两个不同的模板参数定义个Duration类,想要转换,又因为有精度损失, 不能进行隐式类型转换,可以用如下库模板函数强制转

template <class ToDuration, class Clock, class Duration>
time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration> &t);

3. clock

就是time_period的第一个模板参

steady_clock 是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时;
system_clock 是系统的时钟;因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。
high_resolution_clock 是当前系统能够提供的最高精度的时钟;它也是不可以修改的


路名一
1 声望0 粉丝