chrono是c++11中的时间库,提供计时、时钟等功能
学习chrono,关键是理解里面 精度、时间段、时间点的概念
1. 精度
时钟节拍(时间精度),后面的时间段和时间点都是基于精度的计算
模板定义
template <intmax_t _Nx, intmax_t _Dx = 1>
struct ratio { // holds the ratio of _Nx to _Dx
static_assert(_Dx != 0, "zero denominator");
static_assert(-INTMAX_MAX <= _Nx, "numerator too negative");
static_assert(-INTMAX_MAX <= _Dx, "denominator too negative");
static constexpr intmax_t num =
_Sign_of<_Nx>::value * _Sign_of<_Dx>::value * _Abs<_Nx>::value / _Gcd<_Nx, _Dx>::value;
static constexpr intmax_t den = _Abs<_Dx>::value / _Gcd<_Nx, _Dx>::value;
using type = ratio<num, den>;
};
_Nx
表示分子,_Nx
表示分母,单位默认是秒,用来表示精度。比如ratio<1, 1000>
表示的精度是1/1000秒,即1毫秒
_Gcd<_Nx, _Dx>::value表示_Nx和_Dx的最大公约数
ratio<_Nx,_Dx>::num表示分子除以最大公约数的商
ratio<_Nx,_Dx>::den表示分母除以最大公约数的商
ratio<_Nx,_Dx>::type表示该类型的定义,之所以与最大公约数进行相除取商,然后重新使用type指向ratio<num,den>是因为,两者是等价的都表示的是同一精度,num/den=(num*_Gcd<_Nx,_Dx>::value)/(den*_Gcd<_Nx,_Dx>::value)=_Nx/_Dx
比如下面测试用例
// using milli = ratio<1, 1000>; // 系统提供的模板特化类,精度是毫秒
using my_milli = ratio<10, 10000>; // 自己实现的模板特化类,精度也是毫秒
std::cout << std::milli::num << "/" << std::milli::den << std::endl; // 打印:1/1000
std::cout << my_milli::num << "/" << my_milli::den << std::endl; // 打印:1/1000
std::cout << typeid(std::milli::type).name() << std::endl; // 打印:struct std::ratio<1,1000>
std::cout << typeid(my_milli).name() << std::endl; // 打印:struct std::ratio<10,10000>
std::cout << typeid(my_milli::type).name() << std::endl; // 打印:struct std::ratio<1,1000>
可以看出,上面milli和my_milli,虽然模板特化类不一样,但是实际提供的精度是一致的,都是1/1000
补充上系统常见定义的一些精度,注意,没有专门定义精度为秒的模板特化
using micro = ratio<1, 1000000>;
using milli = ratio<1, 1000>;
using centi = ratio<1, 100>;
using deci = ratio<1, 10>;
2. 时间段
构造时间段的模板定义如下
template <class _Rep, class _Period>
class duration { // represents a time duration
public:
using rep = _Rep;
using period = typename _Period::type;
// xxxx
};
这里_Rep
表示一种数值类型,比如int、float、double等,用来存储_Period
的数量
而_Period
就是我们上面提到的ratio<_Nx,_Dx>模板特化类型,一般默认是使用std::ratio<1>表示精度是秒。
综上,时间段就是某个精度的连续个数,比如数量是100个,精度是秒,则表示时间段是100秒。数量是1.2,精度是秒,则表示时间段是1.2秒。
可以通过下面的代码来观察