chrono是一个time library, 源于boost,现在已经是C++标准。话说今年似乎又要出新标准了,好期待啊!

  要使用chrono库,需要#include<chrono>,其所有实现均在std::chrono namespace下。注意标准库里面的每个命名空间代表了一个独立的概念。所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理解三个概念:duration、time_point、clock

1.Durations
std::chrono::duration 表示一段时间,比如两个小时,12.88秒,半个时辰,一炷香的时间等等,只要能换算成秒即可。
1 template <class Rep, class Period = ratio<1> > class duration;

其中

Rep表示一种数值类型,用来表示Period的数量,比如int float double
Period是ratio类型,用来表示【用秒表示的时间单位】比如second milisecond
常用的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这个类模版的原型:
1 template <intmax_t N, intmax_t D = 1> class ratio;

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

由于各种duration表示不同,chrono库提供了duration_cast类型转换函数。
1 template <class ToDuration, class Rep, class Period>
2   constexpr ToDuration duration_cast (const duration<Rep,Period>& dtn);

典型的用法是表示一段时间:
 1 // duration constructor2 #include <iostream>3 #include <ratio>4 #include <chrono>5  6 int main ()7 {8   typedef std::chrono::duration<int> seconds_type;9   typedef std::chrono::duration<int,std::milli> milliseconds_type;
10   typedef std::chrono::duration<int,std::ratio<60*60>> hours_type;
11
12   hours_type h_oneday (24);                  // 24h
13   seconds_type s_oneday (60*60*24);          // 86400s
14   milliseconds_type ms_oneday (s_oneday);    // 86400000ms
15
16   seconds_type s_onehour (60*60);            // 3600s
17 //hours_type h_onehour (s_onehour);          // NOT VALID (type truncates), use:
18   hours_type h_onehour (std::chrono::duration_cast<hours_type>(s_onehour));
19   milliseconds_type ms_onehour (s_onehour);  // 3600000ms (ok, no type truncation)
20
21   std::cout << ms_onehour.count() << "ms in 1h" << std::endl;
22
23   return 0;
24 }
25
26 duration还有一个成员函数count()返回Rep类型的Period数量,看代码:
27
28 // duration::count
29 #include <iostream>     // std::cout
30 #include <chrono>       // std::chrono::seconds, std::chrono::milliseconds
31                         // std::chrono::duration_cast
32
33 int main ()
34 {
35   using namespace std::chrono;
36   // std::chrono::milliseconds is an instatiation of std::chrono::duration:
37   milliseconds foo (1000); // 1 second
38   foo*=60;
39
40   std::cout << "duration (in periods): ";
41   std::cout << foo.count() << " milliseconds.\n";
42
43   std::cout << "duration (in seconds): ";
44   std::cout << foo.count() * milliseconds::period::num / milliseconds::period::den;
45   std::cout << " seconds.\n";
46
47   return 0;
48 }

2.Time points
std::chrono::time_point 表示一个具体时间,如上个世纪80年代、你的生日、今天下午、火车出发时间等,只要它能用计算机时钟表示。鉴于我们使用时间的情景不同,这个time point具体到什么程度,由选用的单位决定。一个time point必须有一个clock计时。参见clock的说明。
1 template <class Clock, class Duration = typename Clock::duration>  class time_point;

下面是构造使用time_point的例子:
 1 // time_point constructors2 #include <iostream>3 #include <chrono>4 #include <ctime>5  6 int main ()7 {8   using namespace std::chrono;9
10   system_clock::time_point tp_epoch;    // epoch value
11
12   time_point <system_clock,duration<int>> tp_seconds (duration<int>(1));
13
14   system_clock::time_point tp (tp_seconds);
15
16   std::cout << "1 second since system_clock epoch = ";
17   std::cout << tp.time_since_epoch().count();
18   std::cout << " system_clock periods." << std::endl;
19
20   // display time_point:
21   std::time_t tt = system_clock::to_time_t(tp);
22   std::cout << "time_point tp is: " << ctime(&tt);
23
24   return 0;
25 }
26  

time_point有一个函数time_from_eproch()用来获得1970年1月1日到time_point时间经过的duration。
举个例子,如果timepoint以天为单位,函数返回的duration就以天为单位。
由于各种time_point表示方式不同,chrono也提供了相应的转换函数 time_point_cast。
1 template <class ToDuration, class Clock, class Duration>
2   time_point<Clock,ToDuration> time_point_cast (const time_point<Clock,Duration>& tp);

比如计算
/

 1 / time_point_cast2 #include <iostream>3 #include <ratio>4 #include <chrono>5  6 int main ()7 {8   using namespace std::chrono;9
10   typedef duration<int,std::ratio<60*60*24>> days_type;
11
12   time_point<system_clock,days_type> today = time_point_cast<days_type>(system_clock::now());
13
14   std::cout << today.time_since_epoch().count() << " days since epoch" << std::endl;
15
16   return 0;
17 }

3.Clocks
std::chrono::system_clock 它表示当前的系统时钟,系统中运行的所有进程使用now()得到的时间是一致的。
每一个clock类中都有确定的time_point, duration, Rep, Period类型。
操作有:
now() 当前时间time_point
to_time_t() time_point转换成time_t秒
from_time_t() 从time_t转换成time_point
典型的应用是计算时间日期:
 1 // system_clock example2 #include <iostream>3 #include <ctime>4 #include <ratio>5 #include <chrono>6  7 int main ()8 {9   using std::chrono::system_clock;
10
11   std::chrono::duration<int,std::ratio<60*60*24> > one_day (1);
12
13   system_clock::time_point today = system_clock::now();
14   system_clock::time_point tomorrow = today + one_day;
15
16   std::time_t tt;
17
18   tt = system_clock::to_time_t ( today );
19   std::cout << "today is: " << ctime(&tt);
20
21   tt = system_clock::to_time_t ( tomorrow );
22   std::cout << "tomorrow will be: " << ctime(&tt);
23
24   return 0;
25 }
26  

std::chrono::steady_clock 为了表示稳定的时间间隔,后一次调用now()得到的时间总是比前一次的值大(这句话的意思其实是,如果中途修改了系统时间,也不影响now()的结果),每次tick都保证过了稳定的时间间隔。
操作有:
now() 获取当前时钟
典型的应用是给算法计时:
 1 // steady_clock example2 #include <iostream>3 #include <ctime>4 #include <ratio>5 #include <chrono>6  7 int main ()8 {9   using namespace std::chrono;
10
11   steady_clock::time_point t1 = steady_clock::now();
12
13   std::cout << "printing out 1000 stars...\n";
14   for (int i=0; i<1000; ++i) std::cout << "*";
15   std::cout << std::endl;
16
17   steady_clock::time_point t2 = steady_clock::now();
18
19   duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
20
21   std::cout << "It took me " << time_span.count() << " seconds.";
22   std::cout << std::endl;
23
24   return 0;
25 }
26  

最后一个时钟,std::chrono::high_resolution_clock 顾名思义,这是系统可用的最高精度的时钟。实际上high_resolution_clock只不过是system_clock或者steady_clock的typedef。
操作有:
now() 获取当前时钟。

转载于:https://www.cnblogs.com/zlshmily/p/10058427.html

C++11 std::chrono库详解相关推荐

  1. chrono是一个time library,C++11 std::chrono库详解

    C++11 std::chrono库详解 chrono是一个time library, 源于boost,现在已经是C++标准.话说今年似乎又要出新标准了,好期待啊! 要使用chrono库,需要#inc ...

  2. (转)树莓派wiringPi库详解

    https://www.cnblogs.com/lulipro/p/5992172.html <div id="post_detail"> 树莓派wiringPi库详解 ...

  3. C++ time.h 库详解

    C++ time.h 库详解 time.h 是C++常用标准库之一 常用函数 clock localtime asctime ctime difftime gmtime time tzset strf ...

  4. 转: std::string用法详解

    原文地址为: 转: std::string用法详解  C++中的string 类 简单介绍 前言: string 的角色 1 string 使用 1.1 充分使用string 操作符 1.2 眼花缭乱 ...

  5. c语言标准库详解(八):数学公式math.h

    c语言标准库详解(八):数学公式<math.h> 概述 头文件<math.h>中声明了一些数学函数和宏. 宏 EDOM 和 ERANGE(在头文件<error.h> ...

  6. c语言标准库详解(十一):可变参数表stdarg.h

    c语言标准库详解(十一):可变参数表<stdarg.h> 概述 头文件<stdarg.h>提供了遍历未知数目的函数参数表的功能. 假定函数 f 带有可变数目的实际参数,last ...

  7. TFHE同态库详解(二)

    引言 关于库的下载与安装可以参考TFHE同态库的安装与简单使用 也可以自己直接下载TFHE同态库 上一部分TFHE同态库详解(一) 这一部分主要是介绍了该库中一些方法以及一些其他声明 src/incl ...

  8. C++静态库与动态库详解与使用

    福利 | 百度 AI 开发者大会免费门票领取    CSDN日报20170628--<实习,背后的选择?>    [直播]探究Linux的总线.设备.驱动模型! C++静态库与动态库详解与 ...

  9. c语言标准库详解(十四):时间函数time.h

    c语言标准库详解(十四):时间函数<time.h> 概述 头文件<time.h>中声明了一些处理日期与时间的类型和函数.其中的一些函数用于处理当地时间,因为时区等原因,当地时间 ...

  10. std::function用法详解

    std::function用法详解 代码在:VCCommon/functionDemo std::function 简介 类模板 std :: function 是一个通用的多态函数包装器. std ...

最新文章

  1. 土壤微生态文献包免费领取 | 150篇近两年高影响因子土壤微生态相关文章
  2. Oozie 出现 ClassNotFoundException 解决方法
  3. vue 二维数组_最近研究Vue源码时我发现的一些好玩函数
  4. boost::mp11::mp_count_if相关用法的测试程序
  5. SAP ABAP Platform 1909最新版的 docker 镜像
  6. 韩国政府计划从Windows 7迁移到Linux
  7. 物理服务器备份系统,物理备份和逻辑备份区别
  8. $ajax不能识别,JQuery/JS Ajax功能无法识别
  9. java基础IO流使用读取一个文件中的文字输出到控制台上
  10. JavaEE中使用绝对目录的说明
  11. Java学习之数据类型的转换
  12. 论《LEFT JOIN条件放ON和WHERE后的区别》
  13. Linux安装nginx详细步骤
  14. 微信小程序开发基础知识总结
  15. 计算机右键管理删除,win10系统删除右键菜单中“管理我的手机”的处理方法
  16. [Zer0pts2020]easy strcmp
  17. 【题解】【PTA-Python题库】第6章-7 找出总分最高的学生 (15 分)
  18. 请假工资扣费总额计算机公式,病假扣款计算公式excel
  19. 计算机应用基础评分标准及评分细则,《计算机应用基础》评分标准
  20. 时间序列平稳性的统计检验

热门文章

  1. 计算图像的均值、标准差
  2. java arraydeque poll,Java ArrayDeque pollLast()方法
  3. asp.net html合并table中的行高度用百分比不起作用,asp.net中多行文本框高度自适应内容的问题...
  4. 施密特正交化_夜思 | 为什么非实对称矩阵对应的特征向量不能施密特正交化?...
  5. 以太坊 solidity 教程
  6. FISCO BCOS 控制台 call调用已经部署的合约 不存在does not exist
  7. Thinkphp 实现动态include
  8. centos镜像 from_Docker 基于 CentOS 基础镜像开发环境的搭建与部署
  9. php向mysql提交数据_PHP 如何向 MySQL 发送数据
  10. 设计模式之GOF23原型模式02