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

C++ 将高分辨率时钟时间转换为整数(时钟),c++,C++,我想通过chrono库获得纳秒精度,但我不知道如何将std::chrono::high_resolution\u clock::now()转换为long int。我试过这个: #include <chrono> #include <iostream> using namespace std; int main() { typedef std::chrono::high_resolution_clock Clock; long int val = Clo

我想通过chrono库获得纳秒精度,但我不知道如何将
std::chrono::high_resolution\u 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;
}
#包括
#包括
使用名称空间std;
int main(){
typedef std::chrono::高分辨率时钟;
long int val=Clock::now();

cout您可以使用std::chrono::duration\u cast:


以下内容适用于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';
使用名称空间std::chrono;
自动现在=高分辨率时钟::现在();
auto nanos=持续时间(现在。时间(从新纪元开始)().count();

std::cout首先,将
now()
返回的时间点转换为从已知时间点开始的持续时间。这可以是时钟的历元:

auto since_epoch = Clock::now().time_since_epoch();
或者您选择的某个时间点:

auto since_epoch = Clock::now() - my_epoch;
然后,您可以通过转换和提取计数来获得纳秒数:

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

如注释中所述,只进行最后一次转换(这会留下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());
long int time=static_cast(std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count());

如果您阅读,您将看到
now
函数返回一个对象(就像错误消息所说的那样)。有关如何打印时间的示例,请参见
time\u point
链接。如果您希望时间以秒为单位,请使用例如。
的优点之一是它是类型安全的;两个示例是时间点和时长是不同的、不可互换的类型,并且类型为您跟踪单位,因此您不能将秒与秒混淆毫秒等。这不是一个完整的解释,实际将其转换为int的部分是
计数
调用这打印出一个巨大的负数。@SusanYanders我认为计数不能返回一个整数negative@aaronman嗯,这很奇怪,我的代码几乎完全一样,但它打印出了我在尝试你的代码时所期望的结果ysthanks@SusanYanders:请注意,
long int
不一定是64位;至少在一个流行的平台上是32位。请使用
auto
std::uint64_t
确保类型足够大。
的优点之一是它是类型安全的;两个示例是时间点和持续时间是不同的,不相互关联的可变类型和类型为您跟踪单位,因此您不能将秒与毫秒等混淆。请尽可能长时间地使用
类型,并尽可能晚地转换为
long
等通用类型。例如:
auto nanos=duration\u cast(now.time\u since\u epoch());std::cout
auto nanos=since_epoch/nanoseconds(1);
应该指出的是,这会导致无单位标量。除非您确实需要无单位值,否则最好坚持使用chrono的单位安全类型。@bames53:确实如此;但在这种情况下,无单位标量正是OP所要求的,也正是
计数()
也给你提供了一些信息。当然,但是新用户应该被告知在
的上下文中使用强类型的好处,并显示出惯用的
用法。新用户经常要求使用弱类型,仅仅是因为他们在其他时间库中习惯了这种情况,而不是因为他们实际上需要弱类型。@bames53:我想你是这样的关于类型安全的讲座对于这个问题来说是相当离题的,但我已经添加了一个简短的讲座,以防有人读到答案并认为离开类型系统听起来是个好主意。
long int time = static_cast<long int>(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count());