为什么chrono :: nanoseconds的表示类型是有符号整数类型?

时间:2017-02-15 10:20:10

标签: c++ std chrono

在文件/usr/include/c++/4.8的gcc 4.84中我们有

namespace std  
{
   typedef duration<int64_t, nano>     nanoseconds;

为什么纳秒的表示类型是有符号整数类型?为什么它没有签名?我们什么时候可以有一个负值的持续时间对象?

3 个答案:

答案 0 :(得分:7)

  

什么时候我们可以有一个负值的持续时间对象?

任何时候你想表示一个负面的持续时间!

e.g。 “十秒前”将为std::chrono::seconds(-10),如果您将其添加到某些time_point t,则会在time_point之前的十秒钟内获得t

标准说“A duration类型衡量两个时间点之间的时间(time_points)。”它并没有说它只能测量非减少时间点之间的时间。这意味着即使t1,它也可用于衡量t2t2 < t1之间的时间。要做到这一点,你需要一个负值。

如果无法签署持续时间,要表示一个意味着“更早”而非“更晚”的偏移量,您必须使用std::pair<bool, duration>之类的内容,其中bool表示是否为正偏移或负偏移,然后你必须这样做:

chrono::time_point adjust(chrono::time_point t, pair<bool, duration> offset)
{
  if (offset.first)  // positive
    return t + offset.second;
  else // negative
    return t - offset.second;
}

这是愚蠢的。通过使用有符号整数,语言和硬件已经更加明确有效地支持了这一点。

答案 1 :(得分:6)

如果定义了两个ab对象,a - b是一个持续时间,则需要a - b = -(b - a)

要实施反交换财产,需要签署持续时间。

答案 2 :(得分:3)

这不仅仅是gcc实现,它是标准([time.syn])所要求的:

typedef duration<signed integer type of at least 64 bits,        nano> nanoseconds;

持续时间表示两个时间点A和B之间的时间差。如果A> B,持续时间为正,否则为负,所以它非常有意义。