如何将std::chrono::high_resolution_clock::now()结果转为long?解决赋值相加报错问题
解决C++ chrono时间点赋值与相加的报错问题
嘿,我来帮你理清这个问题——你遇到的报错都是因为没搞清楚C++ chrono库中time_point和duration这两个核心类型的区别,咱们一步步解决:
为什么你的代码会报错?
先拆解下你遇到的两个错误:
long t = t_start;报错:t_start是std::chrono::time_point<std::chrono::high_resolution_clock>类型,它代表的是一个具体的时间点(比如从系统纪元开始的某个时刻),不是整数类型,自然不能直接赋值给long。t_start += t_end;报错:两个时间点相加没有实际语义(就像“今天+明天”没有意义一样),chrono库根本不支持这种操作。你真正需要的应该是计算两个时间点的时间差,或者给时间点加上一段时间间隔。
正确的解决方案
1. 计算两个时间点的时间差(计时场景常用)
如果你是想统计一段代码的执行时间,正确的做法是计算t_end - t_start得到时间间隔(duration类型),再转换成你需要的单位(毫秒、微秒等),最后提取数值:
#include <chrono> int main() { // 获取开始时间点 auto t_start = std::chrono::high_resolution_clock::now(); // 这里放你要计时的代码逻辑 // ... // 获取结束时间点 auto t_end = std::chrono::high_resolution_clock::now(); // 计算时间差,转换成毫秒(可替换为microseconds、nanoseconds等) auto time_diff = std::chrono::duration_cast<std::chrono::milliseconds>(t_end - t_start); long elapsed_time = time_diff.count(); // 提取数值到long变量 // 如果需要微秒精度: // auto time_diff_us = std::chrono::duration_cast<std::chrono::microseconds>(t_end - t_start); // long elapsed_time_us = time_diff_us.count(); return 0; }
2. 给时间点添加时间间隔(而非另一个时间点)
如果你想在某个时间点基础上增加一段时间(比如5秒),应该用time_point + duration的方式,而非两个时间点相加:
// 给t_start增加5秒,得到新的时间点 auto new_time_point = t_start + std::chrono::seconds(5); // 也可以直接修改原时间点 t_start += std::chrono::milliseconds(100); // 增加100毫秒
3. (特殊场景)获取时间点的原始纪元数值
如果确实需要获取时间点对应的从系统纪元开始的原始数值(比如纳秒数),可以先转成duration再提取:
// 获取从纪元到t_start的时间间隔 auto epoch_duration = t_start.time_since_epoch(); // 转换成纳秒并提取数值(用long long避免溢出) long long epoch_nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(epoch_duration).count();
不过这个操作一般只用于序列化、日志记录等特殊场景,日常计时用时间差就足够了。
内容的提问来源于stack exchange,提问作者Zeeshan Hayat
相关产品推荐
相关产品推荐

