我正在尝试最近的std::chrono
api,我发现在 64 位 Linux 架构和 gcc 编译器上,time_point
和duration
类无法以最大分辨率(纳秒)处理操作系统的最大时间范围。事实上,这些类的存储似乎是 64 位整数类型,相比之下timespec
,timeval
它们在内部使用两个 64 位整数,一个用于秒,一个用于纳秒:
#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 实现不适合存储更大的日期和更宽的时间跨度,从而为类似千年虫的错误奠定了基础。问题是否得到承认?是否有更好的实施或 API 改进的计划?