首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::chrono::duration_cast -?

std::chrono::duration_cast -?
EN

Stack Overflow用户
提问于 2018-01-22 16:22:13
回答 1查看 479关注 0票数 6

我想我在std::chrono::duration_cast的GCC实现中发现了一个bug。有人能帮我确认一下吗?

测试代码:

代码语言:javascript
复制
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的输出为:

代码语言:javascript
复制
Ticks: 9223372036854775807
8
Microseconds: 922337203685477580
earliest:
Sun Sep 14 02:48:05 31197

使用GCC 7.1的输出为:

代码语言:javascript
复制
Ticks: 9223372036854775807
8
Microseconds: -100
earliest:
Thu Jan  1 00:00:00 1970

我说错了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-22 21:33:16

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

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

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

您将一个100纳秒的numeric_limits<Ticks::rep>::max()周期转换为一个长类型的纳秒持续时间,导致明显溢出的等同于numeric_limits<Ticks::rep>::max()*100的东西(您的双补码签名实现碰巧包装,导致-100;无论如何,这仍然是未定义的行为)。

相反,在我的clang副本中,system_clock的持续时间周期为微秒,类型为long long,因此产生的持续时间转换相当于numeric_limits<Ticks::rep>::max()/10

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48377275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档