0

关于clock()from生成的时钟滴答计数的问题<ctime>(其他问题clock()中涵盖了的用法)

在我的系统clock_t上是一个别名,long根据我的编译器,它的最大值<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。这与 d(对于我的系统)为 1000 是一致CLOCKS_PER_SEC#define

因此,如果有 1000CLOCKS_PER_SEC则 2147483647 / 1000 = 2147483.647 秒,大约需要 24-25 天。

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

例如,

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

将输出:-2147483648

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

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

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

4

3 回答 3

3

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

于 2012-08-13T15:08:10.320 回答
2

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

于 2012-08-13T15:28:05.803 回答
0

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

如果您担心环绕,您总是可以将clock_t值转换为 a unsigned long(这意味着您假设它clock_t不比 a 宽long),然后存储/比较该值。

于 2012-08-13T15:06:40.123 回答