7

如果我有以下时钟并使用它来获取自时钟时代以来的滴答计数,那么这个计数实际上代表什么。

std::chrono::high_resolution_clock::now().time_since_epoch().count();

例如,我刚刚运行它并得到了1389375799048790227. 这个数字是什么意思?是纳秒、微秒等吗?

4

3 回答 3

6

您始终可以使用将其转换为所需的时间单位duration_cast

using namespace std::chrono;
auto time = duration_cast<seconds>(high_resolution_clock::now().time_since_epoch());

现在time.count()将返回秒数。

于 2014-01-10T17:56:55.370 回答
6

持续时间的类型是std::chrono::high_resolution_clock::durationstd::chrono::high_resolution_clock::duration::period::num您可以使用:和来检查持续时间的刻度周期std::chrono::high_resolution_clock::duration::period::den。这是一个分数的分子和分母,表示每个刻度的秒数(例如,1/1000000000 表示纳秒)。

纪元未指定,但对你来说是 1389375799048790227 从你得到这个结果开始。

于 2014-01-10T18:09:42.770 回答
1

您可以使用 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::duration1/1000000000 秒或 1 纳秒的滴答周期。因此,调用count()该持续时间会返回纳秒。

于 2016-11-30T21:22:31.107 回答