我正在运行一个简单的程序,在该程序中,我先将time_pointsystem_clock::now合并为this_thread::sleep_for(seconds(1)),再将time_pointsystem_clock::now合并为。

现在,如果我在第一个duration中添加一些额外的time_point,则它在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代表now()中首次调用CheckDuration的时间。所以:
start == T0 + 2s
stop在T0处调用,再加上1秒钟的 sleep 时间,再加上一点点处理时间,我们可以称呼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/

10-12 20:43