gpt4 book ai didi

c++ - std::chrono::duration_cast - GCC 实现有问题吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:23 24 4
gpt4 key购买 nike

我想我在 std::chrono::duration_cast 的 GCC 实现中发现了一个错误。谁能证实我这一点?

测试代码:

using Ticks = std::chrono::duration<long long, std::ratio_multiply<std::chrono::nanoseconds::period, std::ratio<100>>>;

using dur = typename std::chrono::system_clock::duration;

int main()
{

std::chrono::time_point<std::chrono::system_clock> earliest {std::chrono::duration_cast<dur>(
std::chrono::time_point<std::chrono::system_clock, Ticks>::max().time_since_epoch())};

auto ticks = std::chrono::time_point<std::chrono::system_clock, Ticks>::max().time_since_epoch().count();
std::cout << "Ticks: " << ticks << "\n";
std::cout << sizeof(earliest.time_since_epoch().count()) << "\n";
std::cout << "Microseconds: " << earliest.time_since_epoch().count() << "\n";

std::time_t t = std::chrono::system_clock::to_time_t(earliest);
std::cout << "earliest:\n" << std::ctime(&t);
}

clang 3.8 的输出是:

Ticks: 9223372036854775807
8
Microseconds: 922337203685477580
earliest:
Sun Sep 14 02:48:05 31197

GCC 7.1 的输出是:

Ticks: 9223372036854775807
8
Microseconds: -100
earliest:
Thu Jan 1 00:00:00 1970

我错了吗?

最佳答案

这不是错误,您只是导致了签名溢出,因此导致了未定义的行为。实际上,您的代码依赖于平台相关的假设(系统时钟周期和 rep 类型),而这些假设恰好在 gcc 测试用例中失败。

在撰写本文时,system_clock Coliru 的 GCC 环境使用的持续时间为纳秒级的 long 类型,而它又具有相同的 long long 大小。

所以,当你 duration_cast<system_clock::duration>一个time_point<system_clock,Ticks>::max().time_since_epoch()

您正在施放 numeric_limits<Ticks::rep>::max() 的持续时间每个 100 纳秒的周期转换为 long 类型的纳秒持续时间,结果相当于 numeric_limits<Ticks::rep>::max()*100这显然会溢出(您的两个补码签名实现恰好换行,导致 -100 ;无论如何,这仍然是未定义的行为)。

相反,在我的 clang 拷贝上,system_clock具有 long long 类型的微秒持续时间,导致持续时间转换为 ot numeric_limits<Ticks::rep>::max()/10 .

关于c++ - std::chrono::duration_cast - GCC 实现有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48377275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com