2017-02-15 37 views
2

在GCC 4.84文件/usr/include/c++/4.8我們爲什麼chrono :: nanoseconds的表示類型是一個有符號的整數類型?

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

爲什麼表示類型爲納秒級的有符號整型?爲什麼它沒有簽名?我們什麼時候可以有一個負值的持續時間對象?

+3

當您從過去的時間點減去一個時間點。 –

+1

也許消極的持續時間可以表示從某個時間點'之前'。 –

回答

6

如果兩個對象ab被定義爲a - b是持續時間,那麼最好有a - b = -(b - a)

要實現該抗交換屬性,需要對持續時間進行簽名。

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

甲持續時間表示的兩個時間點A和B,如果A> B之間的時間差:

3

它不只是GCC實現,它是由標準([time.syn])所需的,持續時間是正值,否則是負值,所以它非常有意義。

7

什麼時候可以有持續時間對象的負值?

任何時候你想表示一個消極的持續時間!

例如「十秒前」將是std::chrono::seconds(-10),如果您將其添加到某個time_point t那麼您會得到一個time_point,即t之前十秒。

該標準說「A duration類型測量兩個時間點之間的時間(time_points)」。它並沒有說它只能測量非遞減時間點之間的時間。這意味着即使t2 < t1可用於測量t1t2之間的時間。要做到這一點,你需要一個負值。

如果持續時間不能籤的話,代表偏移,意思是「早」不「後」,你必須使用類似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; 
} 

這是愚蠢的。通過使用帶符號整數,語言和硬件已經能夠更加明確和高效地支持這一點。

+0

感謝您的回答。 – MichaelMoser

相關問題