首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理来自std::clock()的clock_t溢出

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

Stack Overflow用户
提问于 2012-08-13 22:59:30
回答 3查看 4.6K关注 0票数 0

有关clock()<ctime>生成的时钟节拍计数的问题。(在其他questions中介绍了clock()的用法)

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

代码语言:javascript
复制
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个。这与#defined (对于我的系统)为1000的CLOCKS_PER_SEC是一致的。

因此,如果有1000个CLOCKS_PER_SEC,那么2147483647 / 1000 = 2147483.647秒,这大约是24-25天。

我不确定这是否真的是由C++定义的行为,但我注意到,超出long限制的常见行为是换行到负端。

例如,

代码语言:javascript
复制
long m = long(2147483647);
std::cout << ++m << std::endl;

输出:-2147483648

因此,假设程序在初始化start之前已经运行了很长时间,并且start恰好被初始化为2147483647 (最大可能的long值)。

在这一点上,我假设我们应该开始包装clock()返回的值,以便在我们再次接近2147482649的时候获得像- 2147483647这样的值。因此,现在我的原始代码可能需要很长时间才能完成循环,比预期的延迟要长得多。

这是实际的行为吗?此样式的pause是否应仅用于延迟小于一定数量的延迟?还有没有其他的检查可以保证这个“安全”?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-13 23:08:10

当你溢出一个带符号的整型时,会发生什么是由实现定义的,并且可能是一个信号。是的,这意味着clock()只能在进程开始后的一段固定时间内使用,而且可能只有在实现确保第一次调用总是返回0的情况下才能使用(我所知道的所有实现都是这种情况)。

票数 3
EN

Stack Overflow用户

发布于 2012-08-13 23:28:06

用法: GetTickCount64();

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724411(v=vs.85).aspx

票数 2
EN

Stack Overflow用户

发布于 2012-08-13 23:06:40

如果clock_t被定义为带符号类型,那么是的,这是预期的行为。

如果您关心回绕,则始终可以将clock_t值转换为unsigned long (这意味着您假设clock_t不比long宽),并存储/比较该值。

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

https://stackoverflow.com/questions/11936951

复制
相关文章

相似问题

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