截取自原文地址: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 。