std::chrono类的简单使用实例及分析

news2025/5/23 15:41:12

author: hjjdebug
date: 2025年 05月 20日 星期二 14:36:17 CST
descrip: std::chrono类的简单使用实例及分析


文章目录

  • 1.实例代码:
  • 2. 代码分析:
    • 2.1 auto t1 = std::chrono::high_resolution_clock::now();
      • 2.1.1 什么是 system_clock
      • 2.1.2 什么是 chrono::time_point?
      • 2.1.3 什么是duration?
        • 2.1.3.1 duration 的一个实例
      • 2.1.4 这么多的内涵,到底怎样理解time_point呢?
      • 2.1.5 time_point t1 在gdb中的表示
    • 2.2 auto delta_t = t2 - t1;
    • 2.3 auto dur_obj = std::chrono::duration<double, std::milli>(delta_t);
      • 2.3.1 duration 对象能够知道数值代表的是毫秒,纳秒或者其它单位吗?

1.实例代码:

$ cat main.cpp
#include <iostream>
#include <unistd.h> //for sleep
#include <chrono>
using namespace std;

int main() {
	//now()是类的静态函数, 
	auto t1 = std::chrono::high_resolution_clock::now(); //t1 是time_point 对象, time_point 对象是什么?
	// 被测代码
	sleep(1);
	auto t2 = std::chrono::high_resolution_clock::now();  // 返回的是时间点对象
	auto delta_t = t2 - t1; //2个time_point 对象相减,肯定被重构了. 返回的是 duration 对象, duration 对象是什么?
	
	auto dur_obj = std::chrono::duration<double, std::milli>(delta_t); //构造函数,参数是duration对象,返回ms为单位的duration对象
	std::cout << "耗时:" << dur_obj.count() << "ms" <<endl; //访问其数值,通过count(), 我们构建的是ms为单位的对象,所以单位就是ms
	dur_obj = std::chrono::duration<double, std::milli>(500); //另一个构造函数,给500就打印500,单位还是ms,由std::milli类型决定的.
	std::cout << "测试打印:" << dur_obj.count() << "ms" <<endl;
	return 0;
}

执行结果
$ ./temp
耗时:1000.14ms
测试打印:500ms

代码很短,可是内涵很丰富. 是c++模板类的入门之路.
下面几乎是逐句分析了.

2. 代码分析:

2.1 auto t1 = std::chrono::high_resolution_clock::now();

std: namespace
chrono: namespace
大命名空间下的小命名空间,此时的命名空间为std::chrono
using high_resolution_clock = system_clock;
using 与typedef 类似, 也与#define 有可比性. 就是说high_resolution_clock 这个类型
是 system_clock 类型的小名, 它们是一个类型. 由此引出 system_clock 类型

2.1.1 什么是 system_clock

    struct system_clock
    { //定义了一堆类型别名, 告诉编译器说, 别慌, 有一堆类型记住它们的小名.
      typedef chrono::nanoseconds duration; //使用ns做duration
      typedef duration::rep rep;
      typedef duration::period period;
      typedef chrono::time_point<system_clock, duration> time_point;
	  //静态变量是属于类的变量, 是全局的.
      static constexpr bool is_steady = false;
	  //静态函数是属于类的函数. 恰似普通的函数, 执行不使用this指针,有3个
	  //成员函数 now() to_time_t(time_point &t), from_time_t(std::time_t t)
      static time_point now() noexcept;
      static std::time_t
      to_time_t(const time_point& __t) noexcept
      {
 return std::time_t(duration_cast<chrono::seconds>
      (__t.time_since_epoch()).count());
      }

      static time_point
      from_time_t(std::time_t __t) noexcept
      {
 typedef chrono::time_point<system_clock, seconds> __from;
 return time_point_cast<system_clock::duration>
        (__from(chrono::seconds(__t)));
      }
    };

now 是system_clock 类的静态成员函数, 返回一个time_point 类型对象

2.1.2 什么是 chrono::time_point?

看一下它的声明,
template<class Clock, class Duration = typename Clock::duration> class time_point;
它是一个类模板. 有两个类型参数.
时钟类型决定了时间的来源, 有system_clock, steady_clock,high_resolution_clock(是system_clock的代名词)

system_clock, 前面已经有交代.
剧透一下 system_clock 的纪元为 1970-01-01 00:00:00 UTC), unix时间戳起点
system_clock是time_point类模板的第一个参数.

time_point类模板的第二个参数类型duration 是什么?

2.1.3 什么是duration?

duration 是一个类型,这里先给duration的一个实例.

2.1.3.1 duration 的一个实例
(gdb) ptype dur_obj
type = struct std::chrono::duration<double, std::ratio<1, 1000> > [with _Rep = double, _Period = std::ratio<1, 1000>] {
  private:
    _Rep __r;

  public:
    duration(void);
    duration(const std::chrono::duration<_Rep, _Period> &);
    ~duration();
    std::chrono::duration<_Rep, _Period> & operator=(const std::chrono::duration<_Rep, _Period> &);
    _Rep count(void) const;
    std::chrono::duration<_Rep, _Period> operator+(void) const;
    std::chrono::duration<_Rep, _Period> operator-(void) const;
    std::chrono::duration<_Rep, _Period> & operator++(void);
    std::chrono::duration<_Rep, _Period> operator++(int);
    std::chrono::duration<_Rep, _Period> & operator--(void);
    std::chrono::duration<_Rep, _Period> operator--(int);
    std::chrono::duration<_Rep, _Period> & operator+=(const std::chrono::duration<_Rep, _Period> &);
    std::chrono::duration<_Rep, _Period> & operator-=(const std::chrono::duration<_Rep, _Period> &);
    std::chrono::duration<_Rep, _Period> & operator*=(const _Rep &);
    std::chrono::duration<_Rep, _Period> & operator/=(const _Rep &);
    static std::chrono::duration<_Rep, _Period> zero(void);
    static std::chrono::duration<_Rep, _Period> min(void);
    static std::chrono::duration<_Rep, _Period> max(void);
    void duration<int>(const int &);
    void duration<double>(const _Rep &);
    void duration<long, std::ratio<1, 1000000000> >(const std::chrono::duration<long, std::ratio<1, 1000000000> > &);

    typedef _Rep rep;
}

它有一个私有成员变量 _Rep __r, __Rep 是represent的简写, 是类模板的第一个类型参数.可能是double或long
类模板还有第2个类型参数, 此处是 std::ratio<1,1000> 类型, 这个类型起码有2个类属性可以使用
std::ratio<1,1000>::num=1
std::ratio<1,1000>::den=1000
至于其它构造,析构,重载运算符就不具体分析了.

2.1.4 这么多的内涵,到底怎样理解time_point呢?

时间点对象timepoint是时间点类模板用system_clock 和 nanoseconds 为类型参数实例化后的一个对象.它有一个duration类型的变量记录其属性
其值说明是从 1970-01-01 00:00:00 开始的 纳秒数, 用long int 表示的数

2.1.5 time_point t1 在gdb中的表示

time_point 包含一个duration 对象 __d, duration对象包含一个实现类型(long或double)变量 __r
(gdb) p t1
$1 = {
__d = {
__r = 1747640811095678930 //1970-01-01 00:00:00开始的时间, 单位仅从对象本身是看不出来的.
}
}
//从类模板类型参数上知道它是ns, 但模板类型参数仅仅是编译期属性, 编译期知道它是ns, 但运行期就不知道了.

(gdb) ptype t1 , 
type = struct std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long, std::ratio<1, 1000000000> > > [with _Clock = std::chrono::_V2::system_clock, _Dur = std::chrono::duration<long, std::ratio<1, 1000000000> >] {
  private:
    _Dur __d;  //私有成员变量, duration 类型

  public:
    time_point(void);
    time_point(const _Dur &);
    _Dur time_since_epoch(void) const;
    std::chrono::time_point<_Clock, _Dur> & operator+=(const _Dur &);
    std::chrono::time_point<_Clock, _Dur> & operator-=(const _Dur &);
    static std::chrono::time_point<_Clock, _Dur> min(void);
    static std::chrono::time_point<_Clock, _Dur> max(void);

    typedef _Dur duration;
}


(gdb) p t2
$2 = {
  __d = {
    __r = 1747640813823889979 //unix 时间点到现在的时间间隔
  }
}

2.2 auto delta_t = t2 - t1;

//两个时间点之差是duration 变量
//2个time_point 对象相减,运算被重构了. 返回的是 duration 对象
(gdb) p delta_t //一种duration 对象
$3 = {
__r = 2728211049
}
(gdb) p dur_obj //另一种duration 对象
$4 = {
__r = 2728.211049
}

2.3 auto dur_obj = std::chrono::duration<double, std::milli>(delta_t);

代码分析:
std::chrono namespace
duration<double, std::milli>: 是一个实例化模板类
std::chrono::duration<double,std::milli>(delta_t);
类名称后面跟上一个参数(这里是duration为参数)就是构建对象的过程(copy构造)
auto dur_obj = std::chrono::duration<double, std::milli>(delta_t); (赋值构造)
把一个无名对象赋值给一个有名对象 dur_obj

duration 对象是什么?数值代表了什么意思?
请参考2.1.4 说明duration 对象是什么类型

2.3.1 duration 对象能够知道数值代表的是毫秒,纳秒或者其它单位吗?

答: 对于一个duration 对象
$4 = {
__r = 2728.211049
}
duration 本身并不知道数值代表的是ms,ns或其它单位.
但是duration类却能够根据构造函数传来的类型及模板参使用的类型对传来的数值进行转换.
这是静态编译的能力.
现在已经计算出了这个值并付给了对象的成员. 但这个对象已经不知道自己是什么单位了,
因为对象本身没有保留单位信息. 即单位信息做为模板类型参数不是运行期特性只是编译期特性.

那我们怎么知道数值的单位是什么呢?
这是你自己的问题, 你自己根据数值的转变过程确定它应该是什么单位.

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

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

相关文章

window xampp apache使用腾讯云ssl证书配置https

下载腾讯云ssl证书&#xff1a; 编辑Apache根目录下 conf/httpd.conf 文件&#xff1a; #LoadModule ssl_module modules/mod_ssl.so和#Include conf/extra/httpd-ssl.conf&#xff0c;去掉前面的#号注释。 编辑Apache根目录下 conf/httpd-ssl.conf 文件&#xff1a; <Vi…

逆向音乐APP:Python爬虫获取音乐榜单 (1)

1. 引言 在数字音乐时代&#xff0c;许多平台如音乐有榜单&#xff0c;限制非付费用户访问高音质或独家内容。然而&#xff0c;从技术研究的角度来看&#xff0c;我们可以通过逆向工程和Python爬虫技术解音乐的API接口&#xff0c;获取付费音乐的播放链接。 2. 技术准备 在当…

支持向量存储:PostgresSQL及pgvector扩展详细安装步骤!老工程接入RAG功能必备!

之前文章和大家分享过&#xff0c;将会出一篇专栏&#xff08;从电脑装ubuntu系统&#xff0c;到安装ubuntu的常用基础软件&#xff1a;jdk、python、node、nginx、maven、supervisor、minio、docker、git、mysql、redis、postgresql、mq、ollama等&#xff09;&#xff0c;目前…

idea常用配置 properties中文输出乱码

propertis配置中文乱码 源码和编译后的都是中文 程序输入效果 idea配置3处 程序输出效果 自定义注释模板 IDEA 中有以下两种配置模板。 File and Code Templates Live Templates File and Code Templates File and Code Templates 用来配置文件和代码模板&#xff0c;即…

day1 大模型学习 Qwen系列学习

Qwen 模型学习笔记:RM、SFT 与 RLHF 技术解析 一、Qwen 模型概述 Qwen 是阿里巴巴开源的大型语言模型系列,旨在实现通用人工智能(AGI)。其架构包括基础语言模型(如 Qwen-7B、Qwen-14B、Qwen-72B)和经过后训练的对话模型(如 Qwen-Chat)。后训练主要通过 SFT 和 RLHF 技…

Unity3D仿星露谷物语开发47之砍树时落叶特效

1、目标 当橡树被砍伐时的落叶粒子效果。 2、创建粒子物体 Hierarchy -> PersistentScene下创建新物体命名为DeciduousLeavesFalling。 添加Particle System组件。 基础配置如下&#xff1a;&#xff08;暂时勾选Looping实时可以看生成效果&#xff0c;后面反选即可&am…

第十节第六部分:常见API:DateTimeFormatter、Period、Duration

DateTimeFormatter类常用方法 Period类常用方法 Duration类常用方法 总结 代码&#xff1a; 代码一&#xff1a;DateTimeFormatter类常用方法 package com.itheima.jdk8_time;import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class DateT…

如何在VSCode中更换默认浏览器:完整指南

引言 作为前端开发者&#xff0c;我们经常需要在VSCode中快速预览HTML文件。默认情况下&#xff0c;VSCode会使用系统默认浏览器打开文件&#xff0c;但有时我们可能需要切换到其他浏览器进行测试。本文将详细介绍如何在VSCode中更换默认浏览器。 方法一&#xff1a;使用VSCo…

【机器人】复现 3D-Mem 具身探索和推理 | 3D场景记忆 CVPR 2025

3D-Mem 是用于具体探索和推理的3D场景记忆&#xff0c;来自CVPR 2025. 本文分享3D-Mem复现和模型推理的过程&#xff5e; 下面是一个推理和选择识别的结果&#xff1a; 看一下机器人探索的效果&#xff1a; 下面是真实环境下&#xff0c;官方跑的demo&#xff0c;3D-Mem无需训…

鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南

文章大纲 引言一、GN常用的内置变量二、GN常用的内置函数三、CMake 重要语法1、生成动态库2、生成静态库3、生成OBJECT 库4、重要的函数和模块4.1、add_definitions4.2、execute_process4.3、add_dependencies4.4、install4.5、FetchContent 四、GN 重要语法1、编译Target2、预…

CSS-5.1 Transition 过渡

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点…

从虚拟仿真到行业实训再到具身智能--华清远见嵌入式物联网人工智能全链路教学方案

2025年5月23-25日&#xff0c;第63届中国高等教育博览会&#xff08;高博会&#xff09;将在长春中铁东北亚国际博览中心举办。作为国内高等教育领域规模大、影响力广的综合性展会&#xff0c;高博会始终聚焦教育科技前沿&#xff0c;吸引全国高校管理者、一线教师、教育科技企…

告别手动绘图!2分钟用 AI 生成波士顿矩阵

波士顿矩阵作为经典工具&#xff0c;始终是企业定位产品组合、制定竞争策略的核心方法论。然而&#xff0c;传统手动绘制矩阵的方式&#xff0c;往往面临数据处理繁琐、图表调整耗时、团队协作低效等痛点。 随着AI技术的发展&#xff0c;这一现状正在被彻底改变。boardmix博思白…

GraphPad Prism工作表的管理

《2025新书现货 GraphPad Prism图表可视化与统计数据分析&#xff08;视频教学版&#xff09;雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 工作…

告别静态UI!Guineration用AI打造用户专属动态界面

摘 要 作为智能原生操作系统 DingOS 的核心技术之一&#xff0c;Guineration 生成式 UI 体系深刻践行了 DingOS“服务定义软件”的核心理念。DingOS 以“一切皆服务、服务按需而取、按用付费”为设计宗旨&#xff0c;致力于通过智能原生能力与粒子服务架构&#xff0c;实现资源…

第六届电子通讯与人工智能国际学术会议(ICECAI 2025)

在数字化浪潮中&#xff0c;电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”&#xff0c;通过5G等高速传输技术&#xff0c;将海量数据实时输送至AI系统&#xff0c;使其能够像人类神经系统般快速响应…

解决vscode在任务栏显示白色图标

长久不用&#xff0c;不知道怎么着就显示成白色图标&#xff0c;虽然不影响使用&#xff0c;但是看起来不爽 问了豆包&#xff0c;给了个解决方法&#xff1a; 1、打开隐藏文件&#xff0c; 由于图标缓存文件是隐藏文件&#xff0c;首先点击资源管理器中的 “查看” 菜单&am…

架构思维:构建高并发扣减服务_分布式无主架构

文章目录 Pre无主架构的任务简单实现分布式无主架构 设计和实现扣减中的返还什么是扣减的返还返还实现原则原则一&#xff1a;扣减完成才能返还原则二&#xff1a;一次扣减可以多次返还原则三&#xff1a;返还的总数量要小于等于原始扣减的数量原则四&#xff1a;返还要保证幂等…

uni-app学习笔记九-vue3 v-for指令

v-for 指令基于一个数组来渲染一个列表。v-for 指令的值需要使用 item in items 形式的特殊语法&#xff0c;其中 items 是源数据的数组&#xff0c;而 item 是迭代项的别名&#xff1a; <template><view v-for"(item,index) in 10" :key"index"…