- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在运行一个简单的程序,其中,我使用 system_clock::now
获取一个 time_point
,然后使用 this_thread::sleep_for(seconds(1))
和 time_point
与 system_clock::now
。
现在,如果我向第一个 time_point
添加一些额外的 duration
,它会在 1 秒和 2 秒内给出完全相同的结果!
这是 demo code :
#include<iostream>
#include<chrono>
#include<thread>
using namespace std;
void CheckDuration (std::chrono::duration<int> seconds)
{
auto start = std::chrono::system_clock::now() + seconds;
std::this_thread::sleep_for(std::chrono::seconds(1));
auto stop = std::chrono::system_clock::now();
cout << "Difference = " << std::chrono::duration_cast<std::chrono::seconds>(stop-start).count() << endl;
}
int main ()
{
CheckDuration(std::chrono::duration<int>(0)); // Difference = 1
CheckDuration(std::chrono::duration<int>(1)); // Difference = 0
CheckDuration(std::chrono::duration<int>(2)); // Difference = 0 <=== ???
CheckDuration(std::chrono::duration<int>(3)); // Difference = -1
}
最佳答案
添加具有更精细单位的输出是明确的,例如:
cout << "Difference = " << std::chrono::duration_cast<std::chrono::milliseconds>(stop-start).count() << endl;
对我来说,对于第 3 种情况(参数 2 秒),输出是:
Difference = -998
(以毫秒为单位)
为了对此进行分析,让T0
表示在CheckDuration
中首次调用now()
的时间。所以:
start == T0 + 2s
stop
在 T0 时被调用,再加上 1 秒的休眠时间,再加上我们可以调用 epsilon 的一小部分处理时间。所以:
stop == T0 + 1s + epsilon
减去这两个我们得到:
T0 + 1s + epsilon - (T0 + 2s)
简化:
epsilon - 1s
在我的例子中,epsilon == 2ms
duration_cast
在无法准确进行转换时具有向零截断 的行为。所以 -998ms 截断为 0s。对于可能对您的计算有帮助的其他持续时间和时间点舍入模式,请参见:
关于c++ - std::chrono::duration_cast 1 秒和 2 秒的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670821/
如果我转换为更粗略的时间单位(例如 std::chrono::minutes 为 std::chrono::hours),duration_cast 将如何 圆?例如,如果转换为 std::chron
我不确定如何使用 duration_cast 及其语法。 duration_cast 可以只在 std:chrono 的成员之间转换吗?是否可以用来将整数或 float 转换为时间点?我也在做一个项目
我想要自纪元以来的毫秒数。一个流行的解决方案如下所示(这里提出的这个问题的解决方案之一 Get time since epoch in milliseconds, preferably using C
我需要将一种 std::chrono::duration 转换为另一种,但我需要知道何时无法进行这种转换,因为该值无法表示。 我没有在标准库中找到任何工具来检查这个。 cppreference pag
我正在使用 std::chrono 清理我的计时器类。其他一切都很顺利,除了我似乎无法将 duration_cast 应用于派生类。嗯,我让它以不同的方式工作,但我仍然想知道我错过了什么。 参见 he
我想问的是,如何以皮秒、飞秒等任何单位计算时间,甚至更精确。我正在计算函数的运行时间并使用纳秒,当我使用毫秒或纳秒时,函数的运行时间返回 0。我认为 Chrono 库只支持到纳秒,这是我在输入 chr
所以在c++11 Chrono 图书馆提供, duration_cast : Computations are done in the widest type available and conver
我正在编写一些必须处理 NTP 时间的代码。我决定使用 std::chrono::duration 来代表他们,我希望这会让我的时间数学更容易做。 NTP 时间由无符号的 64 位整数表示,高 32
我想做的,我的项目: 我想做一个等待0.5秒的程序,例如,做一些事情,比如说cout #include #include using namespace std; using namespace
这是我在这里的第一个问题,我也是 C++ 的新手,但我会尽我所能尽可能具体。如果我含糊不清,请告诉我: 我正在尝试使用 chrono 和 duration_cast 来测量排序方法(合并排序)对给定整
这是一个简单的程序(数组排序): #include #include #include #include #include typedef unsigned int myInt; stati
我想我在 std::chrono::duration_cast 的 GCC 实现中发现了一个错误。谁能证实我这一点? 测试代码: using Ticks = std::chrono::duration
我找不到关于以下哪段代码正确的明确答案: 目的是每隔“val”毫秒在循环中执行一些代码。正如我之前所了解的,您可以将持续时间替换为您想要的任何单位(秒、纳米等)。但是,您是否需要使用 duration
我正在查看一些使用 duration_cast 的代码。看着它,我想知道为什么不使用 static_cast,因为 static_cast 在生活中的目的是在类型之间进行转换。 为什么 C++ 需要一
我不明白下面的行为 unsigned long begin_time = \ std::chrono::duration_cast(std::chrono::steady_clock::now
我正在运行一个简单的程序,其中,我使用 system_clock::now 获取一个 time_point,然后使用 this_thread::sleep_for(seconds(1)) 和 time
当我们使用 std::chrono::duraction_cast 时,我们会这样写: auto int_ms = std::chrono::duration_cast(t2 - t1); 我们在类
我是一名优秀的程序员,十分优秀!