我<chrono>在C++ 11中有几个关于新标题的问题.使用Windows 7,Visual Studio 2012.
查看示例http://en.cppreference.com/w/cpp/chrono
#include <iostream>
#include <chrono>
#include <ctime>
int fibonacci(int n)
{
if (n < 3) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
int result = fibonacci(42);
end = std::chrono::system_clock::now();
int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
(end-start).count();
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds << "s\n";
}
Run Code Online (Sandbox Code Playgroud)
可能的输出
finished computation at Sat Jun 16 20:42:57 …Run Code Online (Sandbox Code Playgroud) 我觉得我对这个有点疯狂,但这对我来说没有意义.在我看来,如果我从now()呼叫返回的任何时间点减去最小时间点,我应该总是得到一个正的持续时间,但这不会发生.
#include <chrono>
#include <iostream>
typedef std::chrono::steady_clock myclock;
int main(int argc, char **argv) {
myclock::time_point min = myclock::time_point::min();
myclock::time_point now = myclock::now();
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(now - min).count();
std::cout << millis << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
为什么打印负整数而不是正整数?(铿锵3.3或g ++ 4.8.1)
我有一个" 人类可读的 "变量hours,minutes,seconds,day,month,year载有与他们的名字值(比方说,我有SYSTEMTIME从结构<windows.h>).
我发现创建一个的唯一方法chrono::time_point是:
SYSTEMTIME sysTime = ...; // Came from some source (file, network, etc. )
tm t;
t.tm_sec = sysTime.wSecond;
t.tm_min = sysTime.wMinute;
t.tm_hour = sysTime.wHour;
t.tm_mday = sysTime.wDay;
t.tm_mon = sysTime.wMonth - 1;
t.tm_year = sysTime.wYear - 1900;
t.tm_isdst = 0;
std::chrono::system_clock::time_point dateTime =
std::chrono::system_clock::from_time_t( mktime( & t ) );
Run Code Online (Sandbox Code Playgroud)
首先,我失去了一毫秒SYSTEMTIME.
第二,(mmm ......)我不喜欢这种转换))
你能用更优雅的方式来解决这个问题吗?
我有一个struct timespec值的流.我想将它们转换为本机C++ 11表示,但我完全被chrono扭转了.什么是最好的目标以及如何从struct timespec或struct timeval到达那里,因为这是一个简单的转换,微秒对于这些时间是否足够好?我认为我想要达到这个目标,对吧?的std ::时辰:: SYSTEM_CLOCK :: time_point
在这种情况下,timespec是来自GPS的UNIX时间.是的,他们使用的是4字节秒(在内存中签名转换后的格式,然后写成无符号格式),它将被固定到2038年.
作为参考,我将把它添加到gsf的C++阅读器中
我有一个毫秒类型的变量,我想将其设置为等于一个方程。这是我到目前为止所做的。它编译并运行,但当它到达这一行时,它停止输入下面的 if 语句。
time = duration<int>(750-(lvl*50));
Run Code Online (Sandbox Code Playgroud)
另一件需要注意的事情是,我确实有一个 if 语句,这也可能是我比较不同数据类型的问题的一部分。这是 if 语句:
if(time_since_last >= time) {
Run Code Online (Sandbox Code Playgroud)
自最后一个变量以来的时间是不同 2 high_resolution_clock::now() 的时间差
打印日志时,我希望每条消息都有一个时间戳,测量自程序启动以来的时间。最好以纳秒为单位,尽管毫秒也可以:
( 110 ns) Some log line
( 1220 ns) Another log line
( 2431 ns) Now for some computation...
(10357 ns) Error!
Run Code Online (Sandbox Code Playgroud)
据我了解,C++ chrono 库中有三种不同的时钟和另外两种 C 风格的时钟:
对于上述任务,每种方法的优点和缺点是什么?
我正在使用它steady_clock来保存某些消息的时间戳.对于调试目的,可以使用日历(或类似的东西).
对于其他时钟,这是静态功能to_time_t,但在GCC(MinGW 4.8.0)上,此功能不存在.
现在我打印的东西像:
Timestamp: 26735259098242
Run Code Online (Sandbox Code Playgroud)
对于时间戳我需要一个steady_clock所以我不能使用system_clock或其他人.
编辑
上一个打印是从time_since_epoch().count()给出的
我知道a的默认值std::chrono::system_clock::time_point是时钟的纪元,但是我在C++ 11标准中找不到任何system_clock与epix纪元相同的命令(1970-01-01T00:00: 00Z).在Linux和Windows上假设这种情况是否安全?或者使用它会更聪明std::chrono::system_clock::from_time_t(0)吗?
我正在尝试最近的std::chronoapi,我发现在64位Linux体系结构和gcc编译器上time_point,duration类和类无法以最大分辨率(纳秒)处理操作系统的最大时间范围.实际上,似乎这些类的存储是一个64位的整数类型,相比于timespec和timeval其内部使用两个64位整数,一个用于秒,一个用于纳秒:
#include <iostream>
#include <chrono>
#include <typeinfo>
#include <time.h>
using namespace std;
using namespace std::chrono;
int main()
{
cout << sizeof(time_point<nanoseconds>) << endl; // 8
cout << sizeof(time_point<nanoseconds>::duration) << endl; // 8
cout << sizeof(time_point<nanoseconds>::duration::rep) << endl; // 8
cout << typeid(time_point<nanoseconds>::duration::rep).name() << endl; // l
cout << sizeof(struct timespec) << endl; // 16
cout << sizeof(struct timeval) << endl; // 16
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在64位Windows(MSVC2017)上,情况非常相似:存储类型也是64位整数.在处理稳定(也称为单调)时钟时这不是问题,但存储限制使得不同的API实现不适合存储更大的日期和更宽的时间跨度,从而为类似Y2K的错误创造了基础.这个问题得到了承认吗?是否有更好的实施或API改进的计划?
我使用 MSVC2015 为 windows 编写了一个解决方案,其中以下代码转换 std::filesystem::last_write_time 结果 time_t:
time_t ftime = std::file_time_type::clock::to_time_t(fs::last_write_time("/Path/filename"))
Run Code Online (Sandbox Code Playgroud)
它运作良好。然后,当我尝试使用 gcc 9.3 (-std=C++2a) 将解决方案移植到 Linux 时,出现以下错误:
错误:'to_time_t' 不是 'std::chrono::time_point::clock' {aka 'std::filesystem::__file_clock'} 的成员
我搜索了一个解决方案,但我发现是基于解决方案包括上例中的std ::文件系统:: last_write_time在cplusplus.com。解决方法如下图:
auto ftime = fs::last_write_time(p);
std::time_t cftime = decltype(ftime)::clock::to_time_t(ftime);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它对我不起作用。实际上,该示例有一条评论说它不适用于 MSVC(曾在 MSVC2015 上工作)或 GCC 9;C++20 将允许便携式输出。
现在,我被卡住了……我怎样才能使用 gcc 进行这种转换?