1.说明
std::choro::duration
是C++11引入的一个用于计算时间滴答周期的类,与之配合使用的是std::ratio
类,该类是一个分数类,为精确表示分数提供了一个方式。
2.std::ratio
我们知道,对于计算机来说,使用浮点类型是会有精度缺失的。所以std::ratio
类便提供了分子和分母,
该类的模板定义如下,Num是分子,Denom是分母。不传入分母的时候,分母默认为1。
假设我们需要表示1秒的千分之一(即一毫秒)就可以用如下方式来定义一个ratio
代表1/1000
这个分数;
cpp中自带的几个ratio
为了方便标识单位之间的差距(单位换算),cpp中预定义了一些常用的ratio
我们可以用类作用域符号::
来访问到这些比例的分子和分母。
3.std::chrono::duration
这个类是用来表示一个时间的周期/长度的,其基于1s为基本单位,用ratio来表示和1s相比的偏移量。
在cppreference上的介绍如下
Class template std::chrono::duration represents a time interval.
It consists of a count of ticks of type Rep and a tick period, where the tick period is a compile-time rational constant representing the number of seconds from one tick to the next.
The only data stored in a duration is a tick count of type Rep. If Rep is floating point, then the duration can represent fractions of ticks. Period is included as part of the duration’s type, and is only used when converting between different durations.
该类的定义如下
其中Rep是一个变量类型,可以传入int、float、double等类型;
Period是一个std::ratio
,可以传入基于一秒的比例,这个比例就代表了时间的单位;
cpp中自带的几个chrono
为了方便我们使用,cpp中自带了几个用于表示时间的chrono的定义
代码里面出现的宏定义其实就是int64_t
的别名。
这些变量之前在学习C++线程休眠的时候就已经遇到过了,从中也能看到std::ratio
在chrono中代表的比例关系,比如一小时是3600秒,那么就需要传入比例std::ratio<3600,1>
,上面的代码里面省略了1是因为ratio的分母缺省值就是1。
代码示例1
上面的代码示例运行结果如下
我们能看到,第一个里面传入的比例是1/100000000
,这就代表1秒包含了100000000个shakes,假设我们需要一个休眠1/100000000
秒的操作,就可以通过std::this_thread::sleep_for
和这个shakes变量来进行精确的定时休眠。
代码示例2
让当前线程休眠100毫秒,有几种不同的方式,都是等价的。
4.std::chrono::duration_cast
为了方便在不同的时间单位之间进行转换,CPP提供了一个特殊的cast来进行处理
比如可以用下面的代码将3秒转换为毫秒,注意圆括号里面的传参是源类型的一个对象,不能只传入类型(那样就不是变量类型转换了)
运行结果如下
The end
基本要了解的内容就这些了。
参考文档
- C++新标准之std::chrono::duration - BCN
- std::chrono::duration - cppreference.com
- std::ratio - cppreference.com