c++ - std::chrono::duration_cast 1 秒和 2 秒的奇怪结果

标签 c++ c++11 output duration c++-chrono

我正在运行一个简单的程序,其中,我使用 system_clock::now 获取一个 time_point,然后使用 this_thread::sleep_for(seconds(1))time_pointsystem_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。对于可能对您的计算有帮助的其他持续时间和时间点舍入模式,请参见:

http://howardhinnant.github.io/duration_io/chrono_util.html

关于c++ - std::chrono::duration_cast 1 秒和 2 秒的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670821/

相关文章:

c++ - 重载operator new(),为什么构造函数被调用了两次?

java - 虚码和扫码的区别

c++ - 如何将 QT GUI 加入非 C++ 主程序?

c++ - 与 std::semi_regular 一起使用时,带有捕获的 lambda 无法编译

c++ - 将 std::left 作为参数传递

c++ - 使用 std::unique_ptr 的 double (二维)数组

c++ - 左值在使用 std::map 时指定 const 对象

c++ - 'const decltype((a))' 没有声明 const 引用?

java - 将字符串写入文件的最有效方法

javascript - jquery 表单结果未显示。我的代码错了吗?