C++中的时间工具

目录

  • 编译期有理数
  • 持续时间 duration
  • 时钟
  • 时间点

本文主要记录C++标准中提供的时间处理工具,并提供简单实现的Linux平台的定时器demo

C++标准库中的chrono库提供了处理时间和日期相关的功能,头文件:#include<chrono>;这个库包含以下组件:

  • 持续时间 duration
  • 时钟 Clock
  • 时间点 Time point
  • 日期 Date(C++20)
  • 时区 Time zone(C++ 20) <ctime>头文件提供了C风格的时间和日期工具。

时间单位转换:1秒(s) = 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 纳秒(ns) = 1,000,000,000,000 皮秒(ps)

编译期有理数

ratio库可以精确表示任何在编译期使用的有限有理数(#include<ratio>)。有理数的分子和分母通过类型为std::intmax_t的编译期常量表示,这是一种有符号的整数类型,最大宽度由编译器指定。
ratio对象的定义方式和普通对象的定义方式不同,而且不能调用ratio对象的方法,需要使用类型别名,如定义一个表示1/60的有理数编译期常量:using r1 = ratio<1, 60>

using r1 = std::ratio<1, 60>;  // 表示1/60
// r1有理数的分子(num)和分母(den)是编译期常量,可通过以下方式访问:
std::intmax_t num { r1::num };
std::intmax_t den { r1::den };

ratio是一个编译期常量,分子和分母需要在编译期确定

std::intmax_t n {1};
std::intmax_t d {60};
using r2 = std::ratio<n, d>;  // 编译失败,n和d是变量,需要定义为常量
constexpr std::intmax_t n {1};
constexpr std::intmax_t d {60};
using r2 = std::ratio<n, d>;

ratio库支持有理数的加减乘除,由于所有这些操作都是在编译期进行的,所有不能使用标准算术运算符,可使用的算术ratio模板包含ratio_addratio_subtract, ratio_multiplyratio_divide执行加减乘除。

持续时间 duration

表示两个时间点之间的间隔时间,通过模板化的std::chrono::duration类来表示。
duration的两个模板参数分别是 Rep 和 Period,第一个参数Rep是用来表示时间数量的类型,通常是一个整数或浮点数类型,如long,double等。第二个模板参数Period 是一个 std::ratio 类型,表示时间单位,如果不指定会使用默认值ratio<1>, 也就是1s。
示例代码:

// 创建一个 duration 对象,表示 10 秒
std::chrono::duration<int> ten_seconds(10);
// 创建一个 duration 对象,表示半分钟(30秒)
std::chrono::duration<double, std::ratio<30, 1>> half_a_minute(1);
// 创建一个 duration 对象,表示 120 毫秒
std::chrono::duration<long, std::milli> tt(120);// 打印:
std::cout << ten_seconds.count() << "senconds\n";
std::cout << half_a_minute.count() << " half minutes or " << std::chrono::duration_cast<std::chrono::seconds>(half_a_minute).count() << " seconds\n";
std::cout << tt.count() << "milliseconds\n";

输出:

10 senconds
1 half minutes or 30 seconds
120 milliseconds

支持以下方法或操作:

  • 支持算术运算:+,-,*,/, ==, <==>
  • duration d:默认构造
  • duration d(d1):copy构造,复制一个duration,d2可能拥有不同的单位类型
  • duration d(val):以d的单位类型建立一个duration
  • d = d1:将d1赋值给d,可能存在隐式转换
  • count():返回间隔的时间数量
  • duration_cast<D>(d):返回d转换为类型D之后的结果
  • static duraton::zero():返回持续时间值等于0的duration
  • static duration::min() / static duration max() : 返回duration模板指定的类型参数表示的最小值/最大值持续时间的duration值
  • duration::rep:获取tick的类型
  • duration::period:获得单位类型的类型
    以下为算术运算和对象拷贝赋值示例:
std::chrono::duration<long, ratio<60>> d3{10};  // d3.count()输出:10
std::chrono::duration<long, ratio<1>> d4{14};  // d4.count()输出:14
if (d3 > d4) {std::cout << "d3 > d4" << endl;
}
++d4; // d4.count()输出:15
d4 *= 2; // d4.count()输出:30
std::chrono::duration<double, ratio<60>> d5 {d3 + d4}; // d5.count()输出:10.5

以上示例说明,duration会按照时间单位(duration的第二个参数)进行隐式类型转换,同理,如下示例:

std::chrono::duration<long> d7 { 30 };   // d7.count()输出:30
std::chrono::duration<double, ratio<60>> d8 { d7 };  // d8.count()输出:0.5

标准库定义了以下时间单位,可以直接使用:

using atto  = ratio<1, 1000000000000000000LL>;
using femto = ratio<1, 1000000000000000LL>;
using pico  = ratio<1, 1000000000000LL>;
using nano  = ratio<1, 1000000000>;
using micro = ratio<1, 1000000>;
using milli = ratio<1, 1000>;
using centi = ratio<1, 100>;
using deci  = ratio<1, 10>;
using deca  = ratio<10, 1>;
using hecto = ratio<100, 1>;
using kilo  = ratio<1000, 1>;
using mega  = ratio<1000000, 1>;
using giga  = ratio<1000000000, 1>;
using tera  = ratio<1000000000000LL, 1>;
using peta  = ratio<1000000000000000LL, 1>;
using exa   = ratio<1000000000000000000LL, 1>;
// 如:
std::chrono::duration<long, std::milli> d(20);

为了更方便和易于理解,标准库中定义了如下时间单位,可以直接使用:

using nanoseconds  = duration<long long, nano>;
using microseconds = duration<long long, micro>;
using milliseconds = duration<long long, milli>;
using seconds      = duration<long long>;
using minutes      = duration<int, ratio<60>>;
using hours        = duration<int, ratio<3600>>;
// 使用如下:
std::chrono::seconds s(10);  // s.count() 输出:10

时钟

时钟由time_point和duration组成,即定义时间点的起点和一个tick周期(就是计时单位,如秒),不同的clock有不同的起点。一般当处理两个时间点的差距时,必须提供相同的起点/clock。
标准库提供了三个clock:

  • system_clock:所提供的timepoint将关联至现行系统的即时时钟,这个clock提供便捷函数to_time_t()和from_time_t(),允许转换成C的系统时间类型time_t;精度为100ns
  • steady_clock:它保证不会被调整;精度为ms
  • high_resolution_clock:表现的是系统中带有最短tick周期的clock,可能就是steady_clock或者system_clock,取决于编译器;精度为100ns

clock提供的类型定义和static成员:

  • clock::duration:获得clock的duration成员
  • clock::rep:获得tick类型
  • clock::period:获得单位类型的类型,等价于clock::duration::period
  • clock::time_point:获得clock的timepoint类型
  • clock::is_steady:如果clock是steady则为true
  • clock::now:获得一个用来表现目前时间的time_point
  • Timepoint:表现出某个特定时间点,关联至某个clock的某个正值或负值duration
    C和Posix中的时间相关函数#include<ctime>:注意,time_t通常只是始自unix起始点(1970.1.1)的秒数,但不能保证如此
    system_clock定义的方法:
  • to_time_t():将给定的time_point转换为time_t
  • from_time_t():将time_t转换为time_point

时间点

time_point类表示某个时间点,存储为相对于纪元(epoch)的duration,表示开始时间。time_point总是和特定的clock关联,纪元就是所关联的clock的原点。例如 UNIX/Linux的时间纪元是1970年1月1日,duration用秒度量。
time_point类包含time_since_epoch 函数,它返回的duration表示所关联clock的纪元和保存的时间点之间的时间。
C++支持合理的time_point和duration算术运算
time_point有三个构造函数:

  • time_point():构造一个time_point,通过duration::zero进行初始化,得到的time_point表示所关联clock的纪元
  • time_point(const duration&d):构造一个time_point,通过给定的duration进行初始化,得到的time_point表示纪元+d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一台Mac同时安装vue2和vue3

背景&#xff1a;电脑需要运行vue2和vue3项目&#xff0c;就得同时有vue2和vue3环境&#xff0c;之前以配置好vue2了&#xff0c;现在增加vue3 1. 新建一个安装vue3的目录 进入vue3文件夹安装vue3 // 注意这里没有参数-g&#xff0c;因为-g全局安装的命令 npm install vue/cli…

Yearning审核平台本地安装配置并结合内网穿透实现远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…

Linux的Vi编辑器显示行数

前言 要在Vi编辑器中显示行数&#xff0c;您可以使用以下方法&#xff1a; 临时显示 进入Vi编辑器。按下 Esc 键确保你处于普通模式。输入 :set number 并按下 Enter 键。 这样就会在Vi编辑器的左侧显示行号。如果想要关闭行号显示&#xff0c;可以输入 :set nonumber 并…

Rust安装——Win10

安装步骤 1、下载RUSTUP-INIT.EXE&#xff08;64-BIT&#xff09; 2、由于国外源下载依赖太慢&#xff0c;因此建议增加win10环境变量配置国内源&#xff0c;增加RUSTUP_DIST_SERVER、RUSTUP_UPDATE_ROOT环境变量即可 RUSTUP_DIST_SERVER随便选择其中的一个源就行&#xff0c;…

人工智能|深度学习——使用多层级注意力机制和keras实现问题分类

代码下载 使用多层级注意力机制和keras实现问题分类资源-CSDN文库 1 准备工作 1.1 什么是词向量? ”词向量”&#xff08;词嵌入&#xff09;是将一类将词的语义映射到向量空间中去的自然语言处理技术。即将一个词用特定的向量来表示&#xff0c;向量之间的距离&#xff08;例…

学习感觉累 速度慢 反应迟钝 容易忘记 说话累 学习的后勤保障

学习的后勤保障 1、睡眠质量 2、精神勿过度紧张 3、过度用脑 4、适量运动 5、营养充足 6、保持新鲜生活每一天 7、简约生活&#xff0c;适中。 8、保持各方面状态良好 身体比较虚弱&#xff0c;气血不足&#xff0c;说话没几句就很累。 身体虚弱和气血不足的问题需要从多方面…

2.6学习总结10

动态规划 知识点 动态规划是一种解决问题的策略&#xff0c;适用于具有重叠子问题和最优子结构性质的问题。 动态规划的基本思想是将原问题分解为一系列子问题&#xff0c;通过求解子问题的最优解来得到原问题的最优解。在求解子问题时&#xff0c;利用已经求解过的子问题的…

力扣热门100题 - 3.无重复字符的最长子串

力扣热门100题 - 3.无重复字符的最长子串 题目描述&#xff1a;示例&#xff1a;提示&#xff1a;解题思路 &#xff08;滑动窗口 哈希表&#xff09;&#xff1a;代码&#xff1a; 题目链接&#xff1a;3. 无重复字符的最长子串 题目描述&#xff1a; 给定一个字符串 s &…

step导入到solidworks外观处理方法

在导入到solidworks中的kuka机器人会变成灰色。看上去很不好看。如何才能大体恢复一下原外观呢&#xff1f;主要可以使用如下两种方法。 主要是使用了将里面的形状单独变成零件&#xff0c;方便装配&#xff0c;使机器人可以变化姿态。造成外观颜色丢失。 1.外观复制 如下图所…

springboot165科研工作量管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

WebSocket基础详解

文章目录 前言由来简介优缺点适用场景兼容性 API介绍构造函数实例方法send()close() 实例属性ws.readyState&#xff08;只读&#xff09;ws.bufferedAmount&#xff08;只读&#xff09;ws.binaryTypeextensions&#xff08;只读&#xff09;protocol&#xff08;只读&#xf…

Power Designer的使用 创建数据库表模型,生成sql语句,生成C#实体类

几年前用过PowerDesigner&#xff0c;好几年没用&#xff0c;有点忘记了&#xff0c;在这里记个笔记&#xff0c;需要的时候翻一翻 PowerDesigner版本16.5 下面的例子是以MySQL数据库为准 生成C#实体类 一 安装 1.1 安装 不让放网盘链接&#xff0c;审核通不过。。。。 …

JCTC | 利用几何深度学习对蛋白质-配体结合pose进行等变灵活建模

Overview 该论文解决了药物开发中蛋白质-配体复合结构灵活建模的挑战。作者提出了一种名为FlexPose的新型深度学习框架&#xff0c;它可以直接对复杂结构进行建模&#xff0c;而不需要传统的采样和评分策略。 该模型结合了标量-向量双特征表示和 SE(3)等变网络设计来处理动态结…

用Python做一个文件夹整理工具

文章目录 目标文件夹对话框文件映射组件完整组件 此前曾经基于函数实现过这个功能&#xff1a;用Python做一个文件夹整理工具。这次基于面向对象的方法&#xff0c;重新实现这个小工具。 本文中提到的FileSystem&#xff0c;来自于这里&#xff1a;Python根据文件后缀整理文件…

2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G3锅炉水处理证考试题库及G3锅炉水处理试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机…

Linux安装Java

yum安装 下面命令直接复制粘贴一件安装java17 yum list installed | grep java #查看已经安装的javayum remove java* -y #移除现在系统已经安装的javayum list | grep java-17 #查看安装java17yum install -y java-17-openjdk #安装java17此处可…

Win32 SDK Gui编程系列之--弹出式菜单

1.弹出式菜单 例如,在命令提示窗口中点击鼠标右键,会出现如下图所示的弹出菜单(下拉菜单)。 这种弹出式菜单的实现很简单。不创建菜单栏,用CreatePopupMenu函数创建的菜单是最顶端的菜单就可以了。 菜单的显示使用TrackPopupMenu函数进行。 例如,点击鼠标右键显示弹出…

C#中使用OpenCvSharp4绘制直线、矩形、圆、文本

C#中使用OpenCvSharp4绘制直线、矩形、圆、文本 继之前的Python中使用Opencv-python库绘制直线、矩形、圆、文本和VC中使用OpenCV绘制直线、矩形、圆和文字&#xff0c;将之前的Python和C示例代码翻译成C#语言&#xff0c;很简单&#xff0c;还是借用OpenCvSharp4库中的Line、…

每日一题——LeetCode1422.分割字符串的最大得分

方法一 暴力枚举 枚举所有分割点的情况&#xff0c;取最大得分 var maxScore function(s) {let res 0;const n s.length;for (let i 1; i < n; i) {let score 0;for (let j 0; j < i; j) {if (s[j] 0) {score;}}for (let j i; j < n; j) {if (s[j] 1) {sco…

Python 的 sys 模块常用方法

sys.argv&#xff1a; 命令行参数 List&#xff0c;第一个元素是程序本身路径 sys.modules.keys()&#xff1a; 返回所有已经导入的模块列表 sys.exc_info() &#xff1a;获取当前正在处理的异常类 exc_type、exc_value、exc_traceback 当前处理的异常详细信息 sys.exit(n)&…