2014-01-10 428 views
1

如果我有以下时钟,并使用它来计算自时钟时代以来的时钟计数,那么这个计数实际上代表了什么。std :: chrono time_since_epoch的默认持续时间

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

例如,我只是跑这个,并得到1389375799048790227。这个数字是什么意思?是纳秒,微秒等吗?

+0

我想说,这取决于'high_resolution_clock'的duration类型。检查它(嵌套的typedef)或使用'duration_cast'到一个已知的持续时间类型。 – dyp

+0

请参阅http://en.cppreference.com/w/cpp/chrono/time_point/time_since_epoch – dyp

回答

4

持续时间的类型是std::chrono::high_resolution_clock::duration。您可以检查持续时间的滴答期:std::chrono::high_resolution_clock::duration::period::numstd::chrono::high_resolution_clock::duration::period::den。这是表示每个滴答的秒数的分数的分子和分母(例如,纳秒为1/1000000000)。

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

2

你可以随时使用duration_cast

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

现在time.count()将返回的秒数将它转换为所需的时间单位。

+0

是的,我知道我可以将它转换成别的东西。但是我问的是如果我不施放它会发生什么?我只是调用'time_since_epoch()'返回一个持续时间,然后调用'count()'。这个数字意味着什么?这算什么? –

+0

@SeanLynch它是自该时钟的时代(在时间点和时代之间)开始的时钟滴答数。 tick的长度取决于标准库实现的'high_resolution_clock',类似地,纪元也由标准库实现定义。 – dyp

1

可以使用的伎俩从斯科特迈尔斯有效的现代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()会返回纳秒。

相关问题