如何在 C++ 中打印 high_resolution_clock
?
#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock high_resolution_clock;
int main()
{
std::cout << high_resolution_clock::now() << std::endl;
}
构建上述结果:
/home/greg/repositories/firstProject/main.cpp:27: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >}’)
std::cout << high_resolution_clock::now() << std::endl;
~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
和
/home/greg/repositories/firstProject/main.cpp:27: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
std::cout << high_resolution_clock::now() << std::endl;
^
看完this answer我试图遍历“容器”:
#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock high_resolution_clock;
int main()
{
for(auto i: high_resolution_clock::now()){
std::cout << i << std::endl;
}
}
然而,这导致了更多的错误。我还尝试使用 printf
并将 high_resolution_clock::now()
转换为 long long
但没有成功。
更新:
尝试另一个答案 suggested here也产生了更多的错误:
#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock high_resolution_clock;
int main()
{
auto i = high_resolution_clock::now();
std::cout << i.time_since_epoch() << std::endl;
}
最佳答案
非常感谢Passer By's answer中的推荐,但恐怕它不太正确。 My date library为 system_clock
提供 I/O , 但不是 high_resolution_clock
.然而Passer By's code恰好与 gcc 一起工作,因为使用该工具集 high_resolution_clock
是 system_clock
的类型别名.
我正在使用 clang,并使用此工具集 high_resolution_clock
是 steady_clock
的类型别名(在 Visual Studio 上也是如此)。在这些平台上 Passer By's code将导致编译时错误,提示没有 operator<<
找到了。
要理解这是为什么,了解 system_clock
之间的区别很重要和 steady_clock
:
system_clock
就像 watch (在智能手机接管地球之前戴在手腕上的东西)。它可以告诉你一天中的时间。由于没有时钟能保持完美的时间,它有时会询问另一个时钟现在几点了,并对自己进行微小的调整以保持准确。
steady_clock
就像一个秒表。它非常适合为运行者计时,或为您的功能计时。它从不 self 调整,而是努力尽可能地每秒标记一秒。但它不知道现在是几点,甚至不知道一年中的哪一天。
high_resolution_clock
也与任何人类日历或时间系统无关,并且允许是 typedef
到 system_clock
或 steady_clock
.在实践中,它总是一个 typedef
这些时钟之一。现在你知道什么了system_clock
和 steady_clock
是,只需使用其中之一,您的代码将更加可移植。
My library为 system_clock
提供 I/O ,因为它的主要目的是扩展 <chrono>
进入日历领域。
您可以使用my library流出chrono::duration
秒。所以如果你真的想要,你可以获得 duration
从一个high_resolution_clock
并流式传输:
#include <iostream>
#include <chrono>
#include "date.h"
typedef std::chrono::high_resolution_clock high_resolution_clock;
using date::operator<<;
int main()
{
std::cout << high_resolution_clock::now().time_since_epoch() << std::endl;
}
这只是为我输出:
2553634286064557ns
在我的平台上,这意味着我的计算机已经启动了大约那么多纳秒。或者,如果您更喜欢可读性更高的内容:
std::cout << date::format("%T\n", high_resolution_clock::now().time_since_epoch());
刚刚输出:
709:32:51.552928058
我的电脑已经开机了大约 709 小时 32 分钟。
<chrono>
视频教程其中包括 system_clock
之间的区别和 steady_clock
,以及更多内容,请参阅:
关于c++ - high_resolution_clock 错误 : cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46362467/