贴一个解释得相对详细的帖子
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 是当前系统能够提供的最高精度的时钟;它也是不可以修改的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。