将高分辨率时钟时间转换为整数(Chrono)

时间:2013-08-02 17:36:39

标签: c++

我希望能够使用chrono库获得纳秒精度,但我无法弄清楚如何将std::chrono::high_resolution_clock::now()转换为long int。我试过这个:

#include <chrono>
#include <iostream>
using namespace std;

int main() {
    typedef std::chrono::high_resolution_clock Clock;

    long int val = Clock::now();

    cout << val << endl;

    cin.ignore();
    return 0;
}

但这给了我错误:error C2440: 'initializing' : cannot convert from 'std::chrono::system_clock::time_point' to 'long' 如何将其转换为64位int?如果我不能,那么我不知道计时器是如何有用的。

4 个答案:

答案 0 :(得分:14)

以下适用于Linux上的GCC 4.8:

using namespace std::chrono;
auto now = high_resolution_clock::now();
auto nanos = duration_cast<nanoseconds>(now.time_since_epoch()).count();
std::cout << nanos << '\n';

答案 1 :(得分:4)

首先,将now()返回的时间点转换为自已知时间点以来的持续时间。这可以是时钟的时代:

auto since_epoch = Clock::now().time_since_epoch();

或您选择的某个时间点:

auto since_epoch = Clock::now() - my_epoch;

然后你可以通过转换和提取计数来获得纳秒数:

auto nanos = duration_cast<nanoseconds>(since_epoch).count();

或通过除以您想要的任何粒度:

auto nanos = since_epoch / nanoseconds(1);

如评论中所述,如果你真的需要一个标量,那么只进行最后一次转换(离开Chrono库的类型系统,丢失有关数字含义的有价值信息);也许是因为您正在与不使用标准类型的API进行交互。对于您自己的计算,类型应该允许您执行您需要的任何有意义的算术。

答案 2 :(得分:1)

一个更简洁的版本的nosid的答案:

long int time = static_cast<long int>(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count());

答案 3 :(得分:-3)

您可以使用std :: chrono :: duration_cast:

http://en.cppreference.com/w/cpp/chrono/duration/duration_cast