std::chrono 学习笔记
1. 基本概念
std::chrono
是 C++ 标准库提供的日期和时间处理工具,引入自 C++11 标准。它提供了一种类型安全的方法来处理时间点和时间段,并且具有高度的可移植性和性能。
在 std::chrono
中,时间被分解为两个主要概念:时间点(time point)和持续时间(duration)。时间点表示时间的特定时刻,而持续时间表示时间段的长度。
2. 内部原理
std::chrono
使用模板类 std::duration
来表示持续时间,其中模板参数 Rep
表示时间的计数类型,通常是整数类型,而 Period
表示每个计数的时间单位。例如,std::chrono::duration<int, std::ratio<1, 1000>>
表示以毫秒为单位的持续时间。
时间点由 std::chrono::time_point
表示,它是持续时间和时钟类型的组合。时钟类型定义了时间点的参考点和时间流逝的规则。常见的时钟类型包括 std::chrono::system_clock
、std::chrono::steady_clock
和 std::chrono::high_resolution_clock
。
3. 成员函数
std::chrono::duration
- 构造函数:
duration()
,构造一个默认的持续时间对象。 - 赋值运算符:
operator=
,将一个持续时间对象赋值给另一个。 - 获取计数:
count()
,返回持续时间的计数值。 - zero:
zero()
,返回零值的特殊持续时间对象。 - min:
min()
,返回最小值的特殊持续时间对象。 - max:
max()
,返回最大值的特殊持续时间对象。
std::chrono::time_point
- 构造函数:
time_point()
,构造一个默认的时间点对象。 - 赋值运算符:
operator=
,将一个时间点对象赋值给另一个。
4. 使用技巧
获取当前时间点
auto now = std::chrono::system_clock::now();
延时执行
std::this_thread::sleep_for(std::chrono::milliseconds(100));
时间点计算
auto duration = end - start;
5. 实战案例
场景一:计时器
#include <iostream>
#include <chrono>
#include <thread>
void timer_callback() {
std::cout << "定时器回调\n";
}
int main() {
auto start = std::chrono::steady_clock::now();
// 执行一些操作
auto end = std::chrono::steady_clock::now();
auto duration = end - start;
std::cout << "程序运行时间: " << std::chrono::duration_cast<std::chrono::milliseconds>(duration).count() << " milliseconds\n";
return 0;
}
场景二:定时器
#include <iostream>
#include <chrono>
#include <thread>
void timer_callback() {
std::cout << "定时器回调\n";
}
int main() {
// 创建定时器线程
std::thread timer_thread([](){
while(true) {
std::this_thread::sleep_for(std::chrono::seconds(1));
timer_callback();
}
});
// 主线程执行其他操作
std::this_thread::sleep_for(std::chrono::seconds(10));
// 关闭定时器线程
timer_thread.join();
return 0;
}
6. 总结
std::chrono
提供了一种类型安全的方式来处理日期和时间,它是 C++11 引入的一个重要特性。通过使用持续时间和时间点,我们可以轻松地执行时间计算和操作,从而更加方便地处理时间相关的任务。