我正在嘗試最近的std::chrono
api,我發現在64位Linux架構和gcc編譯器中,time_point
和duration
類無法以最大分辨率(納秒)處理操作系統的最大時間範圍。事實上,它似乎對這些類的存儲是一個64位的整數類型,相比timespec
和timeval
其內部使用兩個64位整數,一個是秒,一個用於納秒:爲什麼std :: chrono :: time_point不足以存儲結構timespec?
#include <iostream>
#include <chrono>
#include <typeinfo>
#include <time.h>
using namespace std;
using namespace std::chrono;
int main()
{
cout << sizeof(time_point<nanoseconds>) << endl; // 8
cout << sizeof(time_point<nanoseconds>::duration) << endl; // 8
cout << sizeof(time_point<nanoseconds>::duration::rep) << endl; // 8
cout << typeid(time_point<nanoseconds>::duration::rep).name() << endl; // l
cout << sizeof(struct timespec) << endl; // 16
cout << sizeof(struct timeval) << endl; // 16
return 0;
}
在64和Windows(MSVC2017 )情況非常相似:存儲類型也是64位整數。處理穩定(又稱單調)時鐘時,這不是問題,但存儲限制使得不同的API實現不適合存儲更大的日期和更長的時間跨度,從而爲類似於Y2K的錯誤創造了基礎。問題是否得到承認?是否有更好的實施或API改進計劃?
你的回答讓有很大的意義,謝謝。是否有來標準化API在一些商品,例如,一個'time_point'和一個持續時間''一起使用?因此,例如,在這段時間內永遠不會有大於等於1秒的東西? –
ceztko
@ceztko:對不起,我不完全理解這個問題。如果以下內容沒有回答,你可以重新翻譯一下嗎? 'time_point +持續時間'會給你一個'time_point '(它會在2秒內溢出)。沒有內置溢出保護。但是,如果您抓取一個「safeint」庫,則可以使用它來獲取溢出保護。 –
對不起,這個例子其實是錯誤的。我的意思是標準化一個'time_point'和一個'duration ':在這種情況下,我可能會將'duration '轉換爲秒數(以floor爲單位),然後求和到'time_point '並且將這個持續時間重寫爲一秒。只是想知道用API來做到這一點最流暢的方式。 –
ceztko