【发布时间】:2018-02-09 10:10:45
【问题描述】:
我想知道,事件发生还剩多少时间。为此,我正在使用 boost::chrono 或 std::chrono。
算法基本上是这样的:
using std::chrono; // Just for this example
auto start = steady_clock::now();
seconds myTotalTime(10);
while(true){
auto remaining = start + myTotalTime - steady_clock::now();
seconds remainingSecs = duration_cast<seconds>(remaining);
if(remainingSecs.count() <= 0) return true;
else print("Remaining time = " + remainingSecs.count()); // Pseudo-Code!
}
现在可能(理论上)发生以下情况:start 接近时钟周期的末尾(IMO 不知道0 的含义,因此它可能是任意的)。
那么start + myTotalTime 可能会溢出,减法可能会下溢。
即使像steady_clock::now() - start 这样简单的东西也可能下溢。
对于无符号类型,这不是问题。如果它们是无符号的,那么标准保证在溢出 now() 和下溢减法的情况下,我仍然得到正确数量的 steady_clock::now() - start“单位”:10 - 250 = 10 + 256 - 255 = 16 用于 8 位无符号数学。
但签名类型的 AFAIK 上溢/下溢是未定义的行为。
我错过了什么吗?为什么持续时间,尤其是 time_points 定义为有符号而不是无符号类型?
【问题讨论】:
-
我认为您必须决定要让计算机运行多长时间才能达到真正的问题。
steady_clock::now很可能会返回您的计算机运行时间的度量。即便如此,如果您相信您的程序在一千年左右后仍会运行,那么您肯定可以检测到包装并处理它。 -
IMO 你必须权衡利弊。除非您让您的计算机运行千年,否则您不太可能出现带符号持续时间的溢出......并且因为已经设计、实现和使用了类似持续时间类型的对象(例如,表示各种单位,如体积、数据速率、 ...),有符号类型通常非常方便,即使实际单位没有负面含义。
-
我认为这是一个非常好的问题,并引发了一些好的答案。谢谢你的提问。我也有同样的问题。
标签: c++ c++11 integer-overflow chrono