You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一C++程序在不同GCC版本下Chrono输出差异问题咨询

GCC不同版本下chrono时间点运算的输出差异原因分析

以下C++代码在不同版本的GCC编译器下运行会产生不同输出:

#include "date.h"
#include <iostream>
#include <chrono>
#include <string>
#include <set>
#include <ranges>
#include <algorithm>

using namespace date;
using namespace std;
using namespace std::chrono;

using time_point_t = std::chrono::sys_time<std::chrono::microseconds>;

time_point_t parse_tp(std::string s) {
    time_point_t tp;
    std::istringstream in(s);
    in >> parse("%Y%m%d-%T", tp);
    return tp;
}

int
main()
{
    auto tp = parse_tp("20240304-13:00:00.002");
    std::set<time_point_t> s = {tp, tp + std::chrono::seconds(1)};
    std::cout << *std::ranges::lower_bound(s, tp + std::chrono::seconds(1));
}

不同编译器版本的输出对比:

编译器输出
GCC 132024-03-04 13:00:01.002000
GCC 主干版本2024-03-04 13:00:01.001999

原因分析

这个差异的核心是GCC对std::chrono中不同精度duration与time_point相加的实现逻辑进行了标准合规性修复:

  • 在GCC 13中,编译器采用了简化处理:直接将std::chrono::seconds(1)转换为微秒级(1秒=1000000微秒)后与原时间点的微秒值相加,得到13:00:01.002000,该值存入集合后被lower_bound直接命中输出。
  • 在GCC主干版本中,编译器修复了旧版本不符合C++标准的实现:严格遵循标准中不同精度duration运算的规则,先将参与运算的duration提升到共同精度类型再计算。旧版本的简化处理违背了标准规则且存在潜在精度风险,新版本修复后,tp + std::chrono::seconds(1)的计算结果变为13:00:01.001999,存入集合后被lower_bound命中输出。

是否属于编译器bug?

GCC 13中的行为属于不符合C++标准的bug,主干版本的行为是符合标准的正确实现。C++标准明确要求不同精度的duration运算时必须先提升到共同精度类型,旧版本的直接转换方式虽在多数场景下表现正常,但违背了标准规则,新版本的修复是对这一问题的合规性修正。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:07:02