如果我有以下时钟并使用它来获取自时钟时代以来的滴答计数,那么这个计数实际上代表什么。
std::chrono::high_resolution_clock::now().time_since_epoch().count();
例如,我刚刚运行它并得到了1389375799048790227
. 这个数字是什么意思?是纳秒、微秒等吗?
您始终可以使用将其转换为所需的时间单位duration_cast
using namespace std::chrono;
auto time = duration_cast<seconds>(high_resolution_clock::now().time_since_epoch());
现在time.count()
将返回秒数。
持续时间的类型是std::chrono::high_resolution_clock::duration
。std::chrono::high_resolution_clock::duration::period::num
您可以使用:和来检查持续时间的刻度周期std::chrono::high_resolution_clock::duration::period::den
。这是一个分数的分子和分母,表示每个刻度的秒数(例如,1/1000000000 表示纳秒)。
纪元未指定,但对你来说是 1389375799048790227 从你得到这个结果开始。
您可以使用 Scott Meyers 的Effective Modern C++第 4 项中的技巧使编译器在错误消息中显示类型,如下所示:
#include <chrono>
template < typename T >
struct TypeDiscloser;
int main() {
auto epoch_time = std::chrono::high_resolution_clock::now().time_since_epoch();
TypeDiscloser< decltype( epoch_time ) > dummyVar;
}
在ideone 上,这会产生以下编译器错误:
prog.cpp: In function 'int main()':
prog.cpp:9:42: error: aggregate 'TypeDiscloser<std::chrono::duration<long long int, std::ratio<1ll, 1000000000ll> > > dummyVar' has incomplete type and cannot be defined
TypeDiscloser< decltype( epoch_time ) > dummyVar;
^
从编译器错误来看,类型是:
std::chrono::duration<long long int, std::ratio<1ll, 1000000000ll> >
因此,无论 ideone 正在运行什么平台,都std::chrono::time_point::time_since_epoch()
返回std::chrono::duration
1/1000000000 秒或 1 纳秒的滴答周期。因此,调用count()
该持续时间会返回纳秒。