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

时间:2012-08-13 14:59:30

标签: c++ ctime

关于来自clock()的{​​{1}}生成的时钟节拍计数的问题。 (其他questions

涵盖<ctime>的使用情况

在我的系统clock()上是clock_t的别名,根据我的编译器的long,其最大值为2147483647。

<climits>

运行这个我得到大约10060.这与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(); CLOCKS_PER_SEC d(对于我的系统)一致为1000。

所以,如果有1000 #define,那么2147483647/1000 = 2147483.647秒,这大约是24-25天。

我不确定它是否实际上是由C ++定义的行为,但我注意到超出CLOCKS_PER_SEC限制的常见行为是包裹到负面。

例如,

long

输出:-2147483648

假设程序在初始化long m = long(2147483647); std::cout << ++m << std::endl; 之前已经运行了很长时间,并且start碰巧被初始化为2147483647(最大可能start值)。

此时,我假设我们开始包装long返回的值,因此当我们再次接近2147483647时,获取-2147482649等值。 所以现在我的原始代码可能需要很长时间来完成循环,比预期的延迟要长得多。

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

答案 2 :(得分:0)

如果clock_t被定义为签名类型,那么是,这是预期的行为。

如果你担心环绕,你总是可以将clock_t值转换为unsigned long(这意味着你假设clock_t不比long更宽{1}}),并存储/比较该值。