将高分辨率时钟时间转换为整数(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?如果我不能,那么我看不出chrono有多有用。

以下内容适用于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';

首先,将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交互。对于您自己的计算,类型应该允许您执行所需的任何有意义的算术

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());

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

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

最新更新