gpt4 book ai didi

c++ - 处理来自 std::clock() 的 clock_t 溢出

转载 作者:太空宇宙 更新时间:2023-11-04 16:26:05 27 4
gpt4 key购买 nike

关于 clock() 生成的时钟滴答计数的问题来自 <ctime> . (clock() 的用法包含在其他 questions 中)

在我的系统上 clock_tlong 的别名其最大值根据我的编译器 <climits>是 2147483647。

clock_t delay = clock_t(10) * CLOCKS_PER_SEC;
clock_t start = clock();
while(clock() - start < delay); //Note Semi-colon here makes this null statement
std::cout << clock();

运行这个我得到大约 10060。这与 CLOCKS_PER_SEC 一致正在#define d(对于我的系统)为 1000。

所以如果有 1000 CLOCKS_PER_SEC然后是 2147483647/1000 = 2147483.647 秒,大约需要 24-25 天。

我不确定它是否实际上是由 C++ 定义的行为,但我注意到超过 long 的常见行为limit 是绕到负端。

例如,

long m = long(2147483647);
std::cout << ++m << std::endl;

将输出:-2147483648

所以假设程序在初始化之前已经运行了很长时间start , 和 start碰巧被初始化为 2147483647(最大可能的 long 值)。

在这一点上,我假设我们将开始包装 clock() 返回的值所以当我们再次接近 2147483647 时,得到诸如 -2147482649 的值。所以现在我的原始代码可能需要很长时间才能完成循环,比预期的延迟时间长得多。

是实际行为吗?这种风格的暂停是否应该只用于延迟小于一定数量的情况?是否应该进行其他检查以使其“安全”?

最佳答案

当你溢出一个带符号的整数类型时会发生什么是实现定义,并且可能是一个信号。是的,这意味着 clock() 可以仅在流程开始后的固定时间内使用,并且可能只有在实现确保第一次调用时将始终返回 0(我所知道的所有实现的情况)。

关于c++ - 处理来自 std::clock() 的 clock_t 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11936951/

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