11

我希望能够使用 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 有什么用处。

4

4 回答 4

19

以下适用于 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';
于 2013-08-02T17:45:21.427 回答
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 交互。对于您自己的计算,这些类型应该允许您执行您需要的任何有意义的算术。

于 2013-08-02T18:25:21.453 回答
2

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());
于 2015-10-29T21:39:51.883 回答
-3

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

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

于 2013-08-02T17:40:49.420 回答