【转载】C++11 的 chrono 库

295 阅读2分钟

截取自原文地址:C++11 新特性,所有知识点都在这了!

我对文章的格式进行了调整,并对关键部分进行了标注

C++11 关于时间引入了 chrono 库,源于 boost,功能强大,chrono 主要有三个点:

  • duration
  • time_point
  • clocks

duration

std::chrono::duration 表示一段时间,常见的单位有 s、ms 等,示例代码:

// 拿休眠一段时间举例,这里表示休眠 100ms
std::this_thread::sleep_for(std::chrono::milliseconds(100));

sleep_for 里面其实就是 std::chrono::duration,表示一段时间,实际是这样:

typedef duration<int64_t, milli> milliseconds;
typedef duration<int64_t> seconds;

duration 具体模板如下

template <class Rep, class Period = ratio<1> > class duration;

Rep 表示一种数值类型,用来表示 Period 的数量,比如 int、float、double,Period 是 ratio 类型,用来表示【默认是用秒表示的单位时间,比如一毫秒就是 1/1000 秒】比如 second,常用的 duration<Rep, Period> 已经定义好了,在 std::chrono::duration 下:

ratio<3600, 1>:hours
ratio<60, 1>:minutes
ratio<1, 1>:seconds
ratio<1, 1000>:microseconds
ratio<1, 1000000>:microseconds
ratio<1, 1000000000>:nanosecons

ratio 的具体模板如下:

template <intmax_t N, intmax_t D = 1> class ratio;

N 代表分子,D 代表分母,所以 ratio 表示一个分数,我们可以自定义 Period,比如 ratio<2, 1> 表示单位时间是 2 秒

time_point

表示一个具体时间点,如 2020年5月10日10点10分10秒,拿获取当前时间举例:

std::chrono::time_point<std::chrono::high_resolution_clock> Now()
{
    return std::chrono::high_resolution_clock::now();
}
// std::chrono::high_resolution_clock 为高精度时钟,下面会提到

clocks

时钟,chrono 里面提供了三种时钟:

  • steady_clock
  • system_clock
  • high_resolution_clock

steady_clock

稳定的时间间隔,表示相对时间,相对于系统开机启动的时间,无论系统时间如何被更改,后一次调用 now() 肯定比前一次调用 now() 的数值大,可用于计时。

system_clock

表示当前的系统时钟,可以用于获取当前时间:

int main()
{
    using std::chrono::system_clock;
    system_clock::time_point today = system_clock::now();

    std::time_t tt = system_clock::to_time_t(today);
    std::cout << "today is: " << ctime(&tt);

    return 0;
}
// today is: Sun May 10 09:48:36 2020

high_resolution_clock

high_resolution_clock 表示系统可用的最高精度的时钟,实际上就是 system_clock 或者 steady_clock 其中一种的定义,官方没有说明具体是哪个,不同系统可能不一样,我之前看 gcc chrono 源码中 high_resolution_clock 是 steady_clock 的 typedef 。