【发布时间】:2020-05-07 10:57:39
【问题描述】:
我从一个更大的项目中提取了以下简单代码。我试图通过提取日、月、年来模拟期货日期。 我正在使用 std::chrono 库。过了一定天数(我的电脑上大约 8835 天),日期就出错了。 我已经尝试过:
- 使用 g++ 优化标志
- 使用 valgrind 启动
- 寻找有关限制的计时文档
你能重现这种行为吗?
// COMPILE OK && RUN KO (wandbox)
// g++ prog.cc -O2 -march=native -std=c++11
// COMPILE OK && RUN OK (wandbox)
// clang++ prog.cc -Wall -Wextra -std=c++11
#include <iostream>
#include <chrono>
using namespace std;
int main(int ac, char* av[])
{
(void) ac; (void) av;
auto faketime = chrono::system_clock::now();
for( int i=0; i<100000; ++i) {
// doDaily();
faketime += chrono::hours(24);
time_t ftime = chrono::system_clock::to_time_t(faketime);
if( i% 1000 == 0)
cout << "faketime (" << ftime << ") is : " << ctime(&ftime) << endl;
}
auto currtime = chrono::system_clock::now();
time_t cutime = chrono::system_clock::to_time_t(currtime);
cout << "currtime is : " << ctime(&cutime);
return 0;
}
RESULT(第三行出错):
[...]
faketime (9105738161) is : Tue Jul 20 20:42:41 2258
faketime (9192138161) is : Mon Apr 15 20:42:41 2261
faketime (-9168205912) is : Wed Jun 21 21:27:07 1679
faketime (-9081805912) is : Tue Mar 17 21:27:07 1682
faketime (-8995405912) is : Mon Dec 11 21:27:07 1684
currtime is : Thu May 7 12:48:56 2020
已编辑:
- 在哪里出错了。
- 我已经在https://wandbox.org/ 上测试了这段代码:我可以用 gcc 11 重现这个问题,但它可以在 clang++ 上正常工作
- 似乎存在限制,但只能使用 g++ 编译。
【问题讨论】: