我希望能够使用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?如果我不能,那么我不知道计时器是如何有用的。
答案 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