在文件/usr/include/c++/4.8的gcc 4.84中我们有
namespace std
{
typedef duration<int64_t, nano> nanoseconds;
为什么纳秒的表示类型是有符号整数类型?为什么它没有签名?我们什么时候可以有一个负值的持续时间对象?
答案 0 :(得分:7)
什么时候我们可以有一个负值的持续时间对象?
任何时候你想表示一个负面的持续时间!
e.g。 “十秒前”将为std::chrono::seconds(-10)
,如果您将其添加到某些time_point t
,则会在time_point
之前的十秒钟内获得t
。
标准说“A duration
类型衡量两个时间点之间的时间(time_points
)。”它并没有说它只能测量非减少时间点之间的时间。这意味着即使t1
,它也可用于衡量t2
和t2 < 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)
如果定义了两个a
和b
对象,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,持续时间为正,否则为负,所以它非常有意义。